我有这个t-sql代码
set @UrlHash = convert(bigint, hashbytes('MD5', @Url))
Run Code Online (Sandbox Code Playgroud)
我想知道我是否可以在C#中编写一个函数,它返回与上面的行完全相同的哈希,而不需要SQL.
可能吗?
要求是C#必须创建完全相同的哈希.
选择
SELECT CONVERT(BIGINT, HASHBYTES('MD5', 'http://stackoverflow.com'))
Run Code Online (Sandbox Code Playgroud)
将产生以下结果:
-3354682182756996262
Run Code Online (Sandbox Code Playgroud)
如果您现在尝试在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);
Run Code Online (Sandbox Code Playgroud)
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);
Run Code Online (Sandbox Code Playgroud)
numeric现在-3354682182756996262就像你想要的那样.
| 归档时间: |
|
| 查看次数: |
360 次 |
| 最近记录: |