为什么我会在SQL Server中获得不同的哈希编码结果,具体取决于我如何转换字符串



假设我有一个具有以下列的数据库表:

蛋白质序列

id (Integer)
AASequence (nvarchar(max))

还假设该表只有一个条目

当我对其执行以下查询时:

SELECT TOP 1
    AASequence, 
    LOWER(CONVERT(VARCHAR(32), HashBytes('MD5', AASequence), 2)) AS noconvertvarcharmd5,
    LOWER(CONVERT(VARCHAR(32), HashBytes('MD5', CONVERT(VARCHAR, UPPER(AASequence))), 2)) AS uppermd5, 
FROM 
    [EOI].[dbo].[ProteinSequence]
WHERE
    AASequence = 'PLEINEQMMDLHSSLRTWCYFCYNAALHVPGNLTTQLMAKAMEPNAINIHCSEPTDYQQQGRSAASEWGLGIWQIVNLCHMCLGLYACVKTGSFNGCDGGGFQGIWCCWGSFTDYSLDDALGEKWCKEMRPYAHQINDVLIDMPLEFQHDSSIQWPQKACDNNQSTMTFWLAEKIFTFFQGLKQMDSTFQDNCPHATQNQKAMQVRAGSRATEAYCINTSDFMCLSKKWMAACKTKIVDGFQFSQFCWSNMDWATVYICANLTNWFYTGATSSKLVDQVWRESIVGQMFTHLYCPNVCIVPEYCEEMCFNRSQAQCMSADMCSLRSKQCTTELFCYICAGFLGGNVAWNGQRWWETDMYIEYWLIWTLQWHCNKHMHGCSTESRMHEYDDQQILELKNIHVWPFPGYEEYYTECRPEEMTVMQHTASMGSEAHNDLKNAWILDGSDMIADIWEVNICESQPQWWVNEWGKYLCSHKHDGLIDE';

我在SQL Server 2017中获得不同的哈希编码,具体取决于我是否转换输入序列。这是结果

无转换:76EFBE0427AA717507930168758C664D

进行转换:85B592208DA2D9A2415420009FE56CEB

我还发现,这种差异也不会在非常短的字符串上发生。

有人可以帮助我理解为什么会发生这种情况吗?

上下文:在代码审查期间确定了此行为,以寻找原因的原因,原因是我们在数据库中有重复的条目。注意:我们正在使用MD5校验和确定一串字母的独特性。

CONVERT(varchar,upper(AASequence))截断为30个字符,您需要明确提供类型长度,例如 CONVERT(varchar(500),upper(AASequence))

参考:

  • https://learn.microsoft.com/en-us/sql/t-sql/data-types/char-and-varchar-varchar-transact-sql?view=sql-server-server-2017

sqlfiddle:http://sqlfiddle.com/#!18/b4c4b/5

以下函数调用会产生不同的明文。

AASequence
CONVERT(varchar,upper(AASequence)))

不同的明文在=不同的哈希。

让aasequence =快速的棕狐跳过了懒狗。

然后,上(aasequence(=快速的棕狐跳过了懒狗。

最新更新