为什么根据转换字符串的方式在SQL Server中获得不同的哈希编码结果?

时间:2019-06-26 00:10:36

标签: sql-server

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

蛋白质序列

id (Integer)
AASequence (nvarchar(max))

还假设此表只有一个条目

其中AASequence = 'PLEINEQMMDLHSSLRTWCYFCYNAALHVPGNLTTQLMAKAMEPNAINIHCSEPTDYQQQGRSAASEWGLGIWQIVNLCHMCLGLYACVKTGSFNGCDGGGFQGIWCCWGSFTDYSLDDALGEKWCKEMRPYAHQINDVLIDMPLEFQHDSSIQWPQKACDNNQSTMTFWLAEKIFTFFQGLKQMDSTFQDNCPHATQNQKAMQVRAGSRATEAYCINTSDFMCLSKKWMAACKTKIVDGFQFSQFCWSNMDWATVYICANLTNWFYTGATSSKLVDQVWRESIVGQMFTHLYCPNVCIVPEYCEEMCFNRSQAQCMSADMCSLRSKQCTTELFCYICAGFLGGNVAWNGQRWWETDMYIEYWLIWTLQWHCNKHMHGCSTESRMHEYDDQQILELKNIHVWPFPGYEEYYTECRPEEMTVMQHTASMGSEAHNDLKNAWILDGSDMIADIWEVNICESQPQWWVNEWGKYLCSHKHDGLIDE'

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

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

我还发现这种差异在“ ATCG”之类的很短的字符串上也没有发生

有人可以帮助我了解为什么会这样吗?

上下文:此行为是在代码检查期间确定的,以查找为什么我们在数据库中重复条目的原因。注意:我们使用MD5校验和来确定一串字母的唯一性。

2 个答案:

答案 0 :(得分:4)

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

参考文献:

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

答案 1 :(得分:-2)

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

AASequence

CONVERT(varchar,upper(AASequence)))

不同的纯文本输入=不同的哈希值。

让AASequence =敏捷的棕色狐狸跳过了那只懒狗。

然后,上层(AASequence)=棕色的狐狸跃过懒惰的狗。