Конвертировать HashBytes в VarChar - PullRequest
116 голосов
/ 05 августа 2008

Я хочу получить MD5-хэш строкового значения в SQL Server 2005. Я делаю это с помощью следующей команды:

SELECT HashBytes('MD5', 'HelloWorld')

Однако это возвращает VarBinary вместо значения VarChar. Если я пытаюсь конвертировать 0x68E109F0F40CA72A15E05CC22786F8E6 в VarChar, я получаю há ðô§*à\Â'†øæ вместо 68E109F0F40CA72A15E05CC22786F8E6.

Есть ли какое-либо решение на основе SQL?

Да

Ответы [ 7 ]

138 голосов
/ 05 августа 2008

Я нашел решение, где:

SELECT SUBSTRING(master.dbo.fn_varbintohexstr(HashBytes('MD5', 'HelloWorld')), 3, 32)
71 голосов
/ 03 января 2011
SELECT CONVERT(NVARCHAR(32),HashBytes('MD5', 'Hello World'),2)
30 голосов
/ 17 марта 2011

Используйте master.dbo.fn_varbintohexsubstring(0, HashBytes('SHA1', @input), 1, 0) вместо master.dbo.fn_varbintohexstr, а затем substringing результат.

На самом деле fn_varbintohexstr вызывает fn_varbintohexsubstring внутри страны. Первый аргумент fn_varbintohexsubstring говорит ему добавить 0xF в качестве префикса или нет. fn_varbintohexstr вызывает fn_varbintohexsubstring с 1 в качестве первого внутреннего аргумента.

Поскольку вам не нужно 0xF, звоните fn_varbintohexsubstring напрямую.

20 голосов
/ 28 августа 2014

Вопреки тому, что Дэвид Найт говорит, эти две альтернативы возвращают одинаковый ответ в MS SQL 2008:

SELECT CONVERT(VARCHAR(32),HashBytes('MD5', 'Hello World'),2)
SELECT UPPER(master.dbo.fn_varbintohexsubstring(0, HashBytes('MD5', 'Hello World'), 1, 0))

Похоже, что первый вариант лучше, начиная с версии 2008.

10 голосов
/ 07 сентября 2011
convert(varchar(34), HASHBYTES('MD5','Hello World'),1)

(1 для преобразования шестнадцатеричного значения в строку)

преобразовать это в нижнее и удалить 0x из начала строки с помощью подстроки:

substring(lower(convert(varchar(34), HASHBYTES('MD5','Hello World'),1)),3,32)

точно так же, как мы получаем в C # после преобразования байтов в строку

1 голос
/ 25 февраля 2015

Имея личный опыт использования следующего кода в хранимой процедуре, который хэшировал переменную SP, я могу подтвердить, хотя и без документов, эта комбинация работает на 100% согласно моему примеру:

@var=SUBSTRING(master.dbo.fn_varbintohexstr(HashBytes('SHA2_512', @SPvar)), 3, 128)
0 голосов
/ 18 февраля 2010

Изменение типа данных на varbinary мне кажется лучшим.

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