Tôi đã tối ưu hóa một phương pháp mở rộng để so sánh hai luồng cho bình đẳng (byte-cho-byte) - biết rằng đây là một phương pháp nóng tôi đã cố gắng tối ưu hóa nó càng nhiều càng tốt có thể tiếp cận với độ dài nhiều megabyte). Tôi về cơ bản đã đưa ra phương pháp sau:Nếu tuyên bố đúng khối thực thi khi điều kiện là sai
[StructLayout(LayoutKind.Explicit)]
struct Converter
{
[FieldOffset(0)]
public Byte[] Byte;
[FieldOffset(0)]
public UInt64[] UInt64;
}
/// <summary>
/// Compares two streams for byte-by-byte equality.
/// </summary>
/// <param name="target">The target stream.</param>
/// <param name="compareTo">The stream to compare the target to.</param>
/// <returns>A value indicating whether the two streams are identical.</returns>
public static bool CompareBytes(this Stream target, Stream compareTo)
{
if (target == null && compareTo == null)
return true;
if (target == null || compareTo == null)
return false;
if (target.Length != compareTo.Length)
return false;
if (object.ReferenceEquals(target, compareTo))
return true;
if (!target.CanRead || !target.CanSeek)
throw new ArgumentOutOfRangeException("target");
if (!compareTo.CanRead || !compareTo.CanSeek)
throw new ArgumentOutOfRangeException("target");
lock (target)
{
lock (compareTo)
{
var origa = target.Position;
var origb = compareTo.Position;
try
{
target.Position = compareTo.Position = 0;
// Shrink the number of comparisons.
var arr1 = new byte[4096];
var convert1 = new Converter() { Byte = arr1 };
var arr2 = new byte[4096];
var convert2 = new Converter() { Byte = arr2 };
int len;
while ((len = target.Read(arr1, 0, 4096)) != 0)
{
if (compareTo.Read(arr2, 0, 4096) != len)
return false;
for (var i = 0; i < (len/8) + 1; i++)
if (convert1.UInt64[i] != convert2.UInt64[i])
return false;
}
return true;
}
finally
{
target.Position = origa;
compareTo.Position = origb;
}
}
}
}
Vấn đề là các convert1.UInt64[i] != convert2.UInt64[i]
if
khối (trở về false
) đang được đánh giá ngay cả khi giá trị là như nhau. Tôi đã kiểm tra từng cá nhân, sau đó kiểm tra kết quả của 'không bằng'. tôi trong sự hoài nghi tinh khiết:
Tôi đã không sai lầm với con trỏ hướng dẫn - đây là cách mã thực thi và pin đồng hồ đang hoạt động.
Bất kỳ ý tưởng nào về điều này có thể xảy ra?
có hoạt động không nếu bạn thêm {} – rerun
giống như so sánh tham chiếu (đối tượng khác nhau, luôn sai) đang diễn ra thay vì so sánh giá trị – Alex
Tôi nhầm lẫn, cả thuộc tính struct đều có FieldOffset 0, bạn biết bạn đang so sánh táo và táo? – mtijn