1

我有这段 t-sql 代码

set @UrlHash = convert(bigint, hashbytes('MD5', @Url))  

我想知道我是否可以在 C# 中编写一个函数,它返回与上述行完全相同的哈希值,而无需使用 SQL。

是否可以?

要求是 C# 必须创建完全相同的哈希。

4

3 回答 3

7

选择

SELECT CONVERT(BIGINT, HASHBYTES('MD5', 'http://stackoverflow.com')) 

将产生以下结果:

-3354682182756996262

如果您现在尝试在 C# 中创建 MD5 哈希

MD5 md5 = MD5.Create();
byte[] textToHash = Encoding.UTF8.GetBytes("http://stackoverflow.com");
byte[] result = md5.ComputeHash(textToHash); 
long numeric = BitConverter.ToInt64(result, 0);

numeric8957512937738269783


那么问题是什么(除了 MD5 哈希是 128 位和BIGINT/long只是 64 位这一事实之外)?

这是一个字节序问题(字节顺序错误)。让我们使用类修复它BitConverter并根据需要反转字节:

MD5 md5 = MD5.Create();
byte[] textToHash = Encoding.UTF8.GetBytes("http://stackoverflow.com");
byte[] result = md5.ComputeHash(textToHash); 

if (BitConverter.IsLittleEndian)
    Array.Reverse(result);

long numeric = BitConverter.ToInt64(result, 0);

numeric现在-3354682182756996262如你所愿。

于 2013-02-27T08:38:11.330 回答
0

您应该使用 MD5 类,这里是来自http://blogs.msdn.com/b/csharpfaq/archive/2006/10/09/how-do-i-calculate-a-md5-hash-from-a的示例-string_3f00_.aspx,输出为 int 64 :

public int64 CalculateMD5Hash(string input)
{
    // step 1, calculate MD5 hash from input
    MD5 md5 = System.Security.Cryptography.MD5.Create();
    byte[] inputBytes = System.Text.Encoding.ASCII.GetBytes(input);
    byte[] hash = md5.ComputeHash(inputBytes);

    return BitConverter.ToInt64(hash, 0);
}
于 2013-02-26T13:50:52.177 回答
-1

不是 MD5 哈希标准吗?你不能使用标准的 MD5 C# 实现吗?在这里使用代码怎么样?

于 2013-02-26T13:50:29.857 回答