Почему я получаю разные результаты хеширования в SQL Server в зависимости от того, как я преобразовываю строку? - PullRequest
0 голосов
/ 26 июня 2019

Предположим, у меня есть таблица базы данных со следующими столбцами:

ProteinSequence

id (Integer)
AASequence (nvarchar(max))

Также предположим, что в этой таблице есть только одна запись

, где AASequence = «PLEINEQMMDLHSSLRTWCYFCYNAALHVPGNLTTQLMAKAMEPNAINIHCSEPTDYQQQGRSAASEWGLGIWQIVNLCHMCLGLYACVKTGSFNGCDGGGFQGIWCCWGSFTDYSLDDALGEKWCKEMRPYAHQINDVLIDMPLEFQHDSSIQWPQKACDNNQSTMTFWLAEKIFTFFQGLKQMDSTFQDNCPHATQNQKAMQVRAGSRATEAYCINTSDFMCLSKKWMAACKTKIVDGFQFSQFCWSNMDWATVYICANLTNWFYTGATSSKLVDQVWRESIVGQMFTHLYCPNVCIVPEYCEEMCFNRSQAQCMSADMCSLRSKQCTTELFCYICAGFLGGNVAWNGQRWWETDMYIEYWLIWTLQWHCNKHMHGCSTESRMHEYDDQQILELKNIHVWPFPGYEEYYTECRPEEMTVMQHTASMGSEAHNDLKNAWILDGSDMIADIWEVNICESQPQWWVNEWGKYLCSHKHDGLIDE»

1011 * Когда я выполнить следующий запрос на нем:
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

Я также обнаружил, что это несоответствие также не наблюдается на очень коротких строках, таких как "ATC"*

Может ли кто-нибудь помочь мне понять, почему это происходит?

Контекст: это поведение было выявлено в ходе проверок кода при поиске причин, по которым у нас были повторяющиеся записи в базе данных.Примечание: мы использовали контрольные суммы MD5 для определения уникальности цепочки букв.

Ответы [ 2 ]

4 голосов
/ 26 июня 2019

CONVERT(varchar,upper(AASequence)) усекает до 30 символов, вам нужно явно указать длину типа, например CONVERT(varchar(500),upper(AASequence))

Ссылки:

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

0 голосов
/ 26 июня 2019

Следующие вызовы функций приводят к различным открытым текстам.

AASequence

CONVERT(varchar,upper(AASequence)))

Различные открытые тексты = разные хэши.

Let AASequence = Быстрая коричневая лиса перепрыгнула через ленивую собаку.

Тогда верхний (AASequence) = БЫСТРЫЙ КОРИЧНЕВЫЙ ЛИС, ПОСВЯЩЕННЫЙ НА ЛЕНЬШЕЙ СОБАКЕ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...