Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2008 在char列中存储MD5的SQL_Sql Server 2008 - Fatal编程技术网

Sql server 2008 在char列中存储MD5的SQL

Sql server 2008 在char列中存储MD5的SQL,sql-server-2008,Sql Server 2008,我有一个char(32)类型的列,我想在其中存储一个MD5散列键。问题是我使用SQL使用HashBytes()函数更新现有记录,该函数创建如下值 :›=k! ©úw"5Ýâ‘<\ 我需要做什么才能让这些匹配起来?这是编码吗?不清楚“当我通过.NET进行插入时”是什么意思-但你不应该仅仅以原始形式存储二进制数据,因为它看起来就像你在使用HashKey()一样。(顺便问一下,你的意思是HashKey?我找不到它的参考,但有HashBytes。) 两个常见的选项

我有一个char(32)类型的列,我想在其中存储一个MD5散列键。问题是我使用SQL使用HashBytes()函数更新现有记录,该函数创建如下值

:›=k! ©úw"5Ýâ‘<\                

我需要做什么才能让这些匹配起来?这是编码吗?

不清楚“当我通过.NET进行插入时”是什么意思-但你不应该仅仅以原始形式存储二进制数据,因为它看起来就像你在使用
HashKey()
一样。(顺便问一下,你的意思是
HashKey
?我找不到它的参考,但有
HashBytes
。)


两个常见的选项是将原始二进制数据编码为十六进制(看起来像是在第二种情况下所做的),或者使用base64。从.NET开始,任何一种方法都应该很容易(Base64稍微容易一些,使用
Convert.ToBase64String
),您可能只需要找到等效的SQL Server函数。

MD5通常以十六进制编码存储。我猜您的hashkey()SQL函数不是对MD5哈希进行十六进制编码,而是返回表示哈希的ASCII字符。但是您的.NET方法是十六进制编码。如果您将MD5散列一致地存储为十六进制(或者不由您决定,但通常存储为十六进制),那么两者之间的结果应该始终一致

例如,SQL哈希中的:符号是从HashKey()返回的第一个字符。在.NET方法中,前2个字符是3A。31是十进制的51。ASCII代码51是冒号(:)字符。类似地,您可以按自己的方式遍历其他字符,并进行十六进制转换


请参阅任何ASCII代码表以供参考,即HashKey不是SQL函数,您是指HASHBYTES?一些实际的代码会有所帮助。SQL似乎正在计算原始二进制哈希并将其显示为ASCII字符

NET正在计算散列,然后将其转换为十六进制(或者看起来是这样)。CHAR(32)不是存储原始二进制数据的好方法,您可能希望使用二进制类型

SQL中的一个示例:

SELECT SUBSTRING(sys.fn_varbintohexstr(HASHBYTES('MD5',0x2040)),3, 32)
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);
}
这两者将产生相同的价值。(其中0x2040是样本数据)


您可以将十六进制数据存储为CHAR(32)或二进制(16)。存储二进制数据的空间效率是存储十六进制数据的两倍。您不应该做的是将二进制数据存储为CHAR(16)。

切换为binary而不是CHAR,并且一切正常。
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);
}