SQL将MD5存储在char列中

Dus*_*vis 4 sql-server-2008

我有一个char(32)类型的列,我想存储一个MD5哈希键.问题是我使用SQL来使用HashBytes()函数更新现有记录,该函数创建了类似的值

:›=k! ©úw"5Ýâ‘<\                
Run Code Online (Sandbox Code Playgroud)

但是,当我通过.NET进行插入时,它会通过as来实现

3A9B3D6B2120A9FA772235DDE2913C5C
Run Code Online (Sandbox Code Playgroud)

我需要做些什么来使这些匹配?是编码吗?

vcs*_*nes 5

HashKey不是SQL函数,你的意思是HASHBYTES?一些实际代码会有所帮助.SQL似乎是计算原始二进制哈希并将其显示为ASCII字符.

.NET正在计算哈希值,然后将其转换为十六进制(或者它出现).CHAR(32)不是存储原始二进制数据的好方法,您可能希望使用BINARY类型.

SQL中的示例:

SELECT SUBSTRING(sys.fn_varbintohexstr(HASHBYTES('MD5',0x2040)),3, 32)
Run Code Online (Sandbox Code Playgroud)

和.NET中的一个例子:

using (MD5 md5 = MD5.Create())
{
    var data = new byte[] { 0x20, 0x40 };
    var hashed = md5.ComputeHash(data);
    var hexHash = BitConverter.ToString(hashed).Replace("-", "");
    Console.Out.WriteLine("hexHash = {0}", hexHash);
}
Run Code Online (Sandbox Code Playgroud)

这些都会产生相同的价值.(其中0x2040是样本数据).

您可以将十六进制数据存储为CHAR(32),也可以存储为BINARY(16).存储二进制数据的空间效率是将其存储为十六进制的两倍.你不应该做的是将二进制数据存储为CHAR(16).