Конвертировать HashBytes в VarChar

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

SELECT HashBytes('MD5', 'HelloWorld')

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

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

да

5.08.2008 11:49:11
7 ОТВЕТОВ
РЕШЕНИЕ

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

SELECT SUBSTRING(master.dbo.fn_varbintohexstr(HashBytes('MD5', 'HelloWorld')), 3, 32)
145
5.08.2008 14:26:41
fn_varbintohexstr не документированная функция. Используйте CONVERT (Char, @ value, 2)
Cheburek 2.11.2011 11:55:27
Я получил немного от varbinary, потому что мне нужен был способ обновления в хранилище. Это работает как шарм! спасибо ...
nitefrog 13.12.2011 22:33:00
Этот метод очень медленный, использует недокументированную функцию и не работает в Azure. Не круто. Вместо этого используйте Convert!
Rocklan 20.02.2012 05:46:07
CONVERT () не работает в SQL 2005. Если вы используете SQL 2008 или выше, используйте CONVERT () все, что вы хотите. К сожалению, я не знаю ни одной команды, которая будет работать для всех версий SQL, поэтому либо сделайте некоторую сумасшедшую проверку версий в своем скрипте, либо просто отметьте где-нибудь, что вам нужно исправить функцию, если вы обновляете версии SQL.
Carl Bussema 26.04.2012 18:27:27
CONVERT (Char, @ value, 2) выводит только 32 байта - если вы сделаете это для хэша sha1, вы урежете его, вам нужно преобразовать (char (48), @ value, 2), чтобы сохранить соответствующий вывод.
Andrew Hill 26.02.2015 02:18:02

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

-3
17.02.2010 21:31:15
SELECT CONVERT(NVARCHAR(32),HashBytes('MD5', 'Hello World'),2)
79
7.09.2011 16:01:17
это работает в SQL Azure. для SHA1: ВЫБРАТЬ КОНВЕРТ (VARCHAR (40), HashBytes ('SHA1', 'Hello World'), 2)
Raptor 11.01.2011 02:35:14
Нет необходимости использовать nvarchar без необходимости.
Ian Kemp 1.03.2012 14:21:36
В вопросе говорится о SQL Server 2005, и если вы сделаете в нем одно из предложенных выше предложений (и, возможно, любую другую версию), они не сделают того, о чем просят. Вы получаете любой символ, которому байты эквивалентны, а не байты в виде шестнадцатеричной строки, которая запрашивается. GateKiller и Xarqron дают ответы, которые работают.
David Knight 4.04.2012 09:48:20
Где я могу прочитать об этих стилях конвертации? 2 в этом случае, который передается в качестве параметра. И как сделать эквивалент этого в коде C #? Какую кодировку выбрать?
Dmytro Zhluktenko 19.10.2017 16:19:43

Используйте 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напрямую.

30
17.03.2011 16:00:17
convert(varchar(34), HASHBYTES('MD5','Hello World'),1)

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

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

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

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

12
7.09.2011 16:00:51

Вопреки тому, что сказал Дэвид Найт , эти две альтернативы возвращают одинаковый ответ в 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 года.

25
23.05.2017 11:55:03
Не вводите это по ошибке, что дает немного другой ответ! ... convert (varchar, HashBytes ('MD5', 'Hello World')), 2)
andrew pate 10.04.2018 15:21:39

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

@var=SUBSTRING(master.dbo.fn_varbintohexstr(HashBytes('SHA2_512', @SPvar)), 3, 128)
1
24.02.2015 22:54:19