将 C# 生成的校验和与 SQL 服务器进行比较
Comparing a C# generated Checksum with a SQL Server one
我想从 C# 发送大量数据到我的数据库,连同计算的校验和作为最后一个值,应该与 SQL 服务器的存储过程将从这些值计算的校验和进行比较值。
为了实现这一点,我尝试了很多不同的方法,比如 SQL 内置的 Checksum
方法和不同的哈希方法,但是 C# 和 SQL 计算出不同的值,或者散列不适用于我需要的 nvarchars 和整数(fx.MD5 散列)。
有没有人真正设法做到这一点,或者知道怎么做?
参考我们失败的 MD5 尝试:
这里计算出来的结果和c#用nvarchars的时候不一样
哈希方法:
Set @result = convert(nvarchar(32), hashbytes('MD5', @DataID + @Data1 + @Data2 + @Data3), 2)
此外,当您为散列方法提供一个整数作为参数(如 DataID)时,它会抱怨:
"Argument data type int is invalid for argument 2 of hashbytes function."
考虑到评论,这是你如何做到的(/
用作保护字符,只需要一个,因为 int 始终是 4 个字节):
declare @DataID int = 1234
declare @Data1 nvarchar(max) = N'foo æøåè bar'
declare @Data2 nvarchar(max) = N'qux quee'
declare @buffer varbinary(max)
= cast(@DataID as varbinary(4)) + cast(@Data1 + N'/' as varbinary(max)) + cast(@Data2 as varbinary(max))
select @buffer, select hashbytes('MD5', @buffer)
为了
0x000004D266006F006F002000E600F800E500E80061D86BDF20006200610072002F0071007500780020007100750065006500
0x9DA035DB9D9C319BB636D5E89F4D0EC6
C#
int DataID = 1234;
string Data1 = "foo æøåè bar";
string Data2 = "qux quee";
List<byte> buffer = new List<byte>(BitConverter.GetBytes(DataID));
buffer.Reverse(); // swap endianness for int
buffer.AddRange(Encoding.Unicode.GetBytes(Data1 + "/"));
buffer.AddRange(Encoding.Unicode.GetBytes(Data2));
using (MD5 md5 = MD5.Create())
{
byte[] hashBytes = md5.ComputeHash(buffer.ToArray());
//...
}
为了
000004D266006F006F002000E600F800E500E80061D86BDF20006200610072002F0071007500780020007100750065006500
9DA035DB9D9C319BB636D5E89F4D0EC6
我想从 C# 发送大量数据到我的数据库,连同计算的校验和作为最后一个值,应该与 SQL 服务器的存储过程将从这些值计算的校验和进行比较值。
为了实现这一点,我尝试了很多不同的方法,比如 SQL 内置的 Checksum
方法和不同的哈希方法,但是 C# 和 SQL 计算出不同的值,或者散列不适用于我需要的 nvarchars 和整数(fx.MD5 散列)。
有没有人真正设法做到这一点,或者知道怎么做?
参考我们失败的 MD5 尝试:
这里计算出来的结果和c#用nvarchars的时候不一样
哈希方法:
Set @result = convert(nvarchar(32), hashbytes('MD5', @DataID + @Data1 + @Data2 + @Data3), 2)
此外,当您为散列方法提供一个整数作为参数(如 DataID)时,它会抱怨:
"Argument data type int is invalid for argument 2 of hashbytes function."
考虑到评论,这是你如何做到的(/
用作保护字符,只需要一个,因为 int 始终是 4 个字节):
declare @DataID int = 1234
declare @Data1 nvarchar(max) = N'foo æøåè bar'
declare @Data2 nvarchar(max) = N'qux quee'
declare @buffer varbinary(max)
= cast(@DataID as varbinary(4)) + cast(@Data1 + N'/' as varbinary(max)) + cast(@Data2 as varbinary(max))
select @buffer, select hashbytes('MD5', @buffer)
为了
0x000004D266006F006F002000E600F800E500E80061D86BDF20006200610072002F0071007500780020007100750065006500
0x9DA035DB9D9C319BB636D5E89F4D0EC6
C#
int DataID = 1234;
string Data1 = "foo æøåè bar";
string Data2 = "qux quee";
List<byte> buffer = new List<byte>(BitConverter.GetBytes(DataID));
buffer.Reverse(); // swap endianness for int
buffer.AddRange(Encoding.Unicode.GetBytes(Data1 + "/"));
buffer.AddRange(Encoding.Unicode.GetBytes(Data2));
using (MD5 md5 = MD5.Create())
{
byte[] hashBytes = md5.ComputeHash(buffer.ToArray());
//...
}
为了
000004D266006F006F002000E600F800E500E80061D86BDF20006200610072002F0071007500780020007100750065006500
9DA035DB9D9C319BB636D5E89F4D0EC6