// nhanh băm tổng của SQL và C# gương Ukraina // HASH_ZKCRC64 /// ----------------------- -------------------------------------------------- ------------------------------------- riêng Int64 HASH_ZKCRC64 (byte [] Dữ liệu) { Kết quả Int64 = 0x5555555555555555; nếu (Dữ liệu == null || Dữ liệu.Length < = 0) trả lại 0; int SizeGlobalBufer = 8000; int Ost = Dữ liệu.Length% SizeGlobalBufer; int LeftLimit = (Dữ liệu.Length/SizeGlobalBufer) * SizeGlobalBufer;
for (int i = 0; i < LeftLimit; i += 64)
{
Result = Result
^BitConverter.ToInt64(Data, i)
^BitConverter.ToInt64(Data, i + 8)
^BitConverter.ToInt64(Data, i + 16)
^BitConverter.ToInt64(Data, i + 24)
^BitConverter.ToInt64(Data, i + 32)
^BitConverter.ToInt64(Data, i + 40)
^BitConverter.ToInt64(Data, i + 48)
^BitConverter.ToInt64(Data, i + 56);
if ((Result & 0x0000000000000080) != 0)
Result = Result^BitConverter.ToInt64(Data, i + 28);
}
if (Ost > 0)
{
byte[] Bufer = new byte[SizeGlobalBufer];
Array.Copy(Data, LeftLimit, Bufer, 0, Ost);
for (int i = 0; i < SizeGlobalBufer; i += 64)
{
Result = Result
^BitConverter.ToInt64(Bufer, i)
^BitConverter.ToInt64(Bufer, i + 8)
^BitConverter.ToInt64(Bufer, i + 16)
^BitConverter.ToInt64(Bufer, i + 24)
^BitConverter.ToInt64(Bufer, i + 32)
^BitConverter.ToInt64(Bufer, i + 40)
^BitConverter.ToInt64(Bufer, i + 48)
^BitConverter.ToInt64(Bufer, i + 56);
if ((Result & 0x0000000000000080)!=0)
Result = Result^BitConverter.ToInt64(Bufer, i + 28);
}
}
byte[] MiniBufer = BitConverter.GetBytes(Result);
Array.Reverse(MiniBufer);
return BitConverter.ToInt64(MiniBufer, 0);
#region SQL_FUNCTION
/* CREATE FUNCTION [dbo].[HASH_ZKCRC64] (@data as varbinary(MAX)) Returns bigint
AS
BEGIN
Declare @I64 as bigint Set @I64=0x5555555555555555
Declare @Bufer as binary(8000)
Declare @i as int Set @i=1
Declare @j as int
Declare @Len as int Set @Len=Len(@data)
if ((@data is null) Or (@Len<=0)) Return 0
While @i<[email protected]
Begin
Set @Bufer=Substring(@data,@i,8000)
Set @j=1
While @j<=8000
Begin
Set @[email protected]
^CAST(Substring(@Bufer,@j, 8) as bigint)
^CAST(Substring(@Bufer,@j+8, 8) as bigint)
^CAST(Substring(@Bufer,@j+16,8) as bigint)
^CAST(Substring(@Bufer,@j+24,8) as bigint)
^CAST(Substring(@Bufer,@j+32,8) as bigint)
^CAST(Substring(@Bufer,@j+40,8) as bigint)
^CAST(Substring(@Bufer,@j+48,8) as bigint)
^CAST(Substring(@Bufer,@j+56,8) as bigint)
if @I64<0 Set @[email protected]^CAST(Substring(@Bufer,@j+28,8) as bigint)
Set @[email protected]+64
End;
Set @[email protected]+8000
End
Return @I64
END
*/
#endregion
}
Cảm ơn! Tôi đã phải tinh chỉnh nó một chút để trường hợp đặc biệt các kiểu dữ liệu, nhưng tôi đã có thể đến với một cái gì đó đã được nhanh chóng và dựa trên giải pháp này. Xuất sắc! –
Chỉ cần cẩn thận với cột nhận dạng, tôi cũng sẽ sử dụng BINARY_CHECKSUM vì đây là trường hợp nhạy cảm. –