在.net中编写T-SQL功能

本文关键字:T-SQL 功能 net | 更新日期: 2023-09-27 18:01:25

我有这段t-sql代码

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

我想知道我是否可以在c#中编写一个函数,返回与上面行完全相同的哈希值,而不需要去SQL。

有可能吗?

要求c#必须创建完全相同的散列。

在.net中编写T-SQL功能

选择

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);

numeric将成为8957512937738269783


那么问题是什么(除了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,因为你想要

您应该使用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);
}

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