以 '0x' 为前缀的 MD5 哈希值



我可以访问一个允许文件上传的数据库(SQL 2008 R2)。在一个表中,它有一个列叫做' hash_key ',我认为这是md5校验和。

我正试图在我写的东西中包含一些逻辑,这也会计算出md5文件。

问题是这两个系统对同一个文件产生的哈希值有细微的不同。系统将返回如下内容:

0x098F6BCD4621D373CADE4E832627B4F6

对于相同的文件

,我的函数(还有一些在线函数)会返回这个
098F6BCD4621D373CADE4E832627B4F6

正如您所看到的,唯一不同的是前两个(0x)字符。这取决于数据库存储值的方式吗?数据库字段为二进制(16)

在进行比较时,我可以忽略前两个字符吗?

你可以使用SQL函数HASHBYTES()有两个参数:

HASHBYTES('MD5', 'yourString') => 0x349DA9BFF6660DAD199ACF68D353DBA3

或者您可以使用CONVERT()带3个参数:

CONVERT(varchar(32),HASHBYTES('MD5', 'yourString'),2) => 349DA9BFF6660DAD199ACF68D353DBA3

使用0x前缀的原因是数据库(正确地)返回一个十六进制值。在代码中,如果将值转换为十六进制,这两个值将匹配,因为0x实际上不是值的一部分,它只是一个类型标识符

参考解决方案,我想从二进制值中获取十六进制值,从中删除0x

CONVERT(VARCHAR(100),HashedVal2,2)

在存储值之前进行varchar转换

SELECT * , CONVERT(VARCHAR(100),HashedVal2,2)
FROM
(
SELECT * , HASHBYTES('SHA2_256',MyVal) AS HashedVal2
FROM OLEDB_MyTable
)T

最新更新