我有这个t-sql代码
set @UrlHash = convert(bigint, hashbytes('MD5', @Url))
我想知道我是否可以在C#中编写一个函数,它返回与上面一行完全相同的哈希,而不需要SQL。
有可能吗?
要求是C#必须创建完全相同的哈希。
答案 0 :(得分:5)
选择
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位这一事实)?
这是endian问题(字节顺序错误)。让我们使用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
。
答案 1 :(得分: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);
}
答案 2 :(得分:-1)
不是MD5哈希标准吗?你不能使用标准的MD5 C#实现吗?如何使用here中的代码?