SQL BIGINT哈希匹配C#的Int64哈希[复制](SQL bigint hash to ma

2019-07-22 19:28发布

这个问题已经在这里有一个答案:

  • SQL Server的VARBINARY与BitConverter.ToInt64值BIGINT是不同的 1个回答

我想创建一个通用散列alogrithim该散列字符串作为一个64位的整型。

我能够正确地散列字符串:SQL:

select  
    convert
    (
        varchar(64),
        HASHBYTES
        (
            'SHA1',
            'google.com'
        ),
        2
    )

返回BAEA954B95731C68AE6E45BD1E252EB4560CDC45

C#

    System.Security.Cryptography.SHA1 c = System.Security.Cryptography.SHA1.Create();
    System.Text.StringBuilder sb = new StringBuilder();
    byte[] b = c.ComputeHash(Encoding.UTF8.GetBytes("google.com"));
    for (int i = 0; i < b.Length;i++ )
    {
        byte by = b[i];
        sb.Append(by.ToString("x2").ToUpper());
    }

    return sb.ToString();

retruns BAEA954B95731C68AE6E45BD1E252EB4560CDC45

然而,当我转换为一个BIGINT /长值不匹配:SQL:

select  
    convert
    (
        bigint,
        HASHBYTES
        (
            'SHA1',
            'google.com'
        )
    )

返回2172193747348806725

C#:

    System.Security.Cryptography.SHA1 c = System.Security.Cryptography.SHA1.Create();
    byte[] b = c.ComputeHash(Encoding.UTF8.GetBytes("google.com"));
    return BitConverter.ToInt64(b, 0);

返回7501998164347841210

如何获得这些数字的任何想法,以配合?

Answer 1:

你的SQL BIGINT需要的最后8个字节,而C#实现取前8个字节(和逆转他们,因为其对小尾数运行)。

采取在C#阵列的适当范围和扭转它。 然后,你应该罚款。

做了一些编码:

System.Security.Cryptography.SHA1 c = System.Security.Cryptography.SHA1.Create();
byte[] b = c.ComputeHash(Encoding.UTF8.GetBytes("google.com"));
long value = BitConverter.ToInt64(b, 12);
value = IPAddress.HostToNetworkOrder(value);

Debug.WriteLine(value);
// writes 2172193747348806725


文章来源: SQL bigint hash to match c# int64 hash [duplicate]