Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C语言中的SqlServer校验和#_C#_Sql Server_Checksum - Fatal编程技术网

C# C语言中的SqlServer校验和#

C# C语言中的SqlServer校验和#,c#,sql-server,checksum,C#,Sql Server,Checksum,我在SQLServer2008R2中使用chechsum函数,我希望在C#应用程序中获得相同的int值。 c#中是否有类似于sql校验和函数的方法返回值? Thanx在SQL Server论坛上发表声明: SQL Server中的内置CHECKUM函数是基于一系列4位左旋转异或操作构建的。更多解释请参见此 我能够将二进制校验和移植到c,它似乎正在工作。。。稍后我将查看普通校验和 private int SQLBinaryChecksum(string text) { long sum =

我在SQLServer2008R2中使用chechsum函数,我希望在C#应用程序中获得相同的int值。 c#中是否有类似于sql校验和函数的方法返回值?
Thanx在SQL Server论坛上发表声明:

SQL Server中的内置CHECKUM函数是基于一系列4位左旋转异或操作构建的。更多解释请参见此

我能够将二进制校验和移植到c,它似乎正在工作。。。稍后我将查看普通校验和

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;
}
private int-SQLBinaryChecksum(字符串文本)
{
长和=0;
字节溢出;
for(int i=0;i2147483647)
总和=总和-4294967296;

否则,如果(sum>=32768&&sum=128&&sum,则T-SQL文档未指定除此之外的
checksum()
所使用的算法:

校验和在其参数列表上计算一个称为校验和的散列值。散列值 用于构建哈希索引。如果校验和的参数是列,则 索引是在计算出的校验和值上建立的,结果是一个哈希索引。这可用于 相等搜索列


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

校验和
文档没有披露它是如何计算哈希的。如果您想要在t-SQL和C#中使用哈希,请从

中支持的算法中选择。如果您需要对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。

@Dan的二进制校验和实现可以在c#中大大简化,直到

int-SqlBinaryChecksum(字符串文本)
{
uint累加器=0;
for(int i=0;i-4);
累加器=左旋转4位^text[i];
}
返回(int)累加器;
}

这也使算法的作用更加清晰。对于每个字符,一个4位然后是一个带有字符字节的异或实际上SQLServer为校验和函数返回一个int。MD5哈希通过HASHBYTES函数完成,并返回一个varbinary(它应该是C#函数的返回值)。我正在寻找同样返回int的C#函数。你说得对,我仔细阅读了MSDN页面,它没有说明任何内容……建议使用HASHBYTES,它实现了各种哈希算法。类似的问题请看我的答案,我在SQL Server论坛上找到了该算法。它是一系列4位左旋转xor操作。根据Microsoft的说法,“您不能直接调用此函数”,但是它可以“出现在C#app中的LINQ to Entities查询中,[link]()。这太糟糕了,我正在寻找一种将字符串散列为int的有效方法(尽管存在冲突)。@Andres-string.GetHashCode()将字符串散列为int,您可以从SQLCLR函数中公开它以在数据库中使用。这非常棒,似乎可以很好地处理文本。不过,我有一个varbinary(max)它存储文件,我将此函数更改为采用字节数组而不是字符串。它可以很好地用于文本文件,但不会返回与二进制文件相同的结果。有什么想法吗?如何实现它以使用像校验和(col1,col2,col3)这样的少量字符串?请小心使用此解决方案。如果二进制\u校验和()从可变宽度列中读取,则只读取前255个字符。当然,您可以在上面的代码中模拟这一点,但您的代码在尝试匹配SQL值()时必须注意这一点。