Преобразовать HashBytes в VarChar

127

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

SELECT HashBytes('MD5', 'HelloWorld')

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

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

да

GateKiller
источник

Ответы:

147

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

SELECT SUBSTRING(master.dbo.fn_varbintohexstr(HashBytes('MD5', 'HelloWorld')), 3, 32)
GateKiller
источник
19
fn_varbintohexstr - это недокументированная функция. Use CONVERT (Char, @ value, 2)
Чебурек
Я только что получил от varbinary, так как мне нужен способ обновления на складе. Это сработало как шарм! спасибо ...
nitefrog
Этот метод очень медленный, использует недокументированную функцию и не работает в Azure. Не круто. Вместо этого используйте Convert!
Rocklan
4
CONVERT () не работает в SQL 2005. Если вы используете SQL 2008 или более позднюю версию, используйте CONVERT () сколько угодно. К сожалению, я не знаю ни одной команды, которая будет работать для всех версий SQL, поэтому либо сделайте сумасшедшую проверку версии в своем скрипте, либо просто отметьте где-нибудь, что вам нужно исправить эту функцию, если вы обновляете версии SQL.
Карл Буссема,
5
CONVERT (Char, @ value, 2) выводит только 32 байта - если вы сделаете это для хэша sha1, вы его усечете, вам нужно convert (char (48), @ value, 2), чтобы сохранить соответствующий вывод.
Эндрю Хилл
82
SELECT CONVERT(NVARCHAR(32),HashBytes('MD5', 'Hello World'),2)
Пройдоха
источник
4
это работает в SQL Azure. для SHA1: SELECT CONVERT (VARCHAR (40), HashBytes ('SHA1', 'Hello World'), 2)
Raptor
4
Нет необходимости использовать nvarchar без надобности.
Ян Кемп
3
В вопросе указан SQL Server 2005, и если вы выполните одно из приведенных выше предложений (и, возможно, любую другую версию), они не сделают то, о чем просят. Вы получаете любой символ, которому байты эквивалентны, а не байты в виде шестнадцатеричной строки, которая требуется. GateKiller и Xarqron дают ответы, которые работают.
Дэвид Найт
Где я могу прочитать об этих стилях преобразования? 2 в данном случае, который передается как параметр. И как сделать аналог этого в коде C #? Какую кодировку мне выбрать?
Дмитрий Жлуктенко
31

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

Xaqron
источник
27

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

Тимо Рийконен
источник
Не вводите это по ошибке, это даст несколько иной ответ! ... convert (varchar, HashBytes ('MD5', 'Hello World')), 2)
andrew Pate
13
convert(varchar(34), HASHBYTES('MD5','Hello World'),1)

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

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

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

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

Ramans
источник
2

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

@var=SUBSTRING(master.dbo.fn_varbintohexstr(HashBytes('SHA2_512', @SPvar)), 3, 128)
Саймон Джонс
источник
-3

Мне кажется, что лучше всего подойдет изменение типа данных на varbinary.

anopres
источник