C#中的SqlServer校验和

时间:2013-09-18 16:28:24

标签: c# sql-server checksum

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

5 个答案:

答案 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,然后再将其与字符的字节进行异或