在.NET中编写T-SQL功能

Kno*_*uch 1 c# t-sql

我有这个t-sql代码

set @UrlHash = convert(bigint, hashbytes('MD5', @Url))  
Run Code Online (Sandbox Code Playgroud)

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

可能吗?

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

slo*_*oth 5

选择

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就像你想要的那样.