我在sql server 2008 R2中使用chechsum函数,我希望在C#app中获得相同的int值。 在c#中是否有任何等效的方法返回像sql checksum函数这样的值? 感谢名单
答案 0 :(得分:12)
在SQL Server论坛上,在此page,声明:
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;
}
答案 1 :(得分:2)
T-SQL文档未指定checksum()
在此之外使用的算法:
CHECKSUM通过其参数列表计算一个称为校验和的哈希值。哈希值 旨在用于构建哈希索引。如果CHECKSUM的参数是列,那么 index是在计算的CHECKSUM值上构建的,结果是哈希索引。这可以用于 平等搜索列。
不太可能计算MD5哈希值,因为它的返回值(计算的哈希值)是32位整数; MD5哈希的长度为128位。
答案 2 :(得分:1)
CHECKSUM
docs没有透露它如何计算哈希值。如果你想要一个可以在T-SQL和C#中使用的哈希,请选择HashBytes中支持的算法
答案 3 :(得分:0)
如果您需要对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。
答案 4 :(得分:0)
@Dan的BinaryChecksum的实现可以在c#中简化到
int SqlBinaryChecksum(string text)
{
uint accumulator = 0;
for (int i = 0; i < text.Length; i++)
{
var leftRotate4bit = (accumulator << 4) | (accumulator >> -4);
accumulator = leftRotate4bit ^ text[i];
}
return (int)accumulator;
}
这也使算法正在做的事情更加清晰。对于每个字符,先输入一个4位circular shift,然后再将其与字符的字节进行异或