// suma de hash rápido de SQL y C# espejo Ucrania // HASH_ZKCRC64 /// ----------------------- -------------------------------------------------- ------------------------------------- privado Int64 HASH_ZKCRC64 (byte [] datos) { Int64 Resultado = 0x5555555555555555; if (Datos == nulo || Data.Length < = 0) return 0; int SizeGlobalBufer = 8000; int Ost = Data.Length% SizeGlobalBufer; int LeftLimit = (Data.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
}
Gracias! Tuve que ajustarlo un poco a un caso especial de los tipos de datos, pero pude encontrar algo rápido y basado en esta solución. ¡Excelente! –
Solo tenga cuidado con las columnas de identidad, también usaría BINARY_CHECKSUM ya que es sensible a mayúsculas y minúsculas. –