C#中的SqlServer校验和

我在sql server 2008 R2中使用chechsum函数,我想在C#app中获得相同的int值。 在c#中是否有任何等效的方法返回像sql checksum函数这样的值? 感谢名单

CHECKSUM文档没有公开它如何计算哈希值。 如果你想要一个可以在T-SQL和C#中使用的哈希,请选择HashBytes中支持的算法

在SQL Server论坛上,在此页面上说明:

SQL Server中的内置CHECKUM函数基于一系列4位左旋转xor运算。 有关更多说明,请参阅此post 。

我能够将BINARY_CHECKSUM移植到c#,它似乎正在工作……我稍后会看看普通的CHECKSUM ……

 private int SQLBinaryChecksum(string text) { long sum = 0; byte overflow; for (int i = 0; i < text.Length; i++) { sum = (long)((16 * sum) ^ Convert.ToUInt32(text[i])); overflow = (byte)(sum / 4294967296); sum = sum - overflow * 4294967296; sum = sum ^ overflow; } if (sum > 2147483647) sum = sum - 4294967296; else if (sum >= 32768 && sum <= 65535) sum = sum - 65536; else if (sum >= 128 && sum <= 255) sum = sum - 256; return (int)sum; } 

T-SQL文档没有指定checksum()之外使用的算法:

CHECKSUM在其参数列表上计算一个称为校验和的哈希值。 哈希值旨在用于构建哈希索引。 如果CHECKSUM的参数是列,并且在计算的CHECKSUM值上构建索引,则结果是哈希索引。 这可用于对列进行相等搜索。

它不太可能计算MD5哈希值,因为它的返回值(计算的哈希值)是32位整数; MD5哈希的长度为128位。

如果您需要对GUID执行校验和,请更改dna2的答案:

 private int SQLBinaryChecksum(byte[] text) 

使用字节数组,SQL中的值将与C#中的值匹配。 去测试:

 var a = Guid.Parse("DEAA5789-6B51-4EED-B370-36F347A0E8E4").ToByteArray(); Console.WriteLine(SQLBinaryChecksum(a)); 

vs SQL:

 select BINARY_CHECKSUM(CONVERT(uniqueidentifier,'DEAA5789-6B51-4EED-B370-36F347A0E8E4')) 

两个答案都是-1897092103。