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

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

SELECT HashBytes('MD5', 'HelloWorld')

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

Есть ли SQL-решение?

Да

Ответ 1

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

SELECT SUBSTRING(master.dbo.fn_varbintohexstr(HashBytes('MD5', 'HelloWorld')), 3, 32)

Ответ 2

SELECT CONVERT(NVARCHAR(32),HashBytes('MD5', 'Hello World'),2)

Ответ 3

Используйте 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 как первый аргумент internaly.

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

Ответ 4

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

Ответ 5

convert(varchar(34), HASHBYTES('MD5','Hello World'),1)

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

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

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

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

Ответ 6

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

@var=SUBSTRING(master.dbo.fn_varbintohexstr(HashBytes('SHA2_512', @SPvar)), 3, 128)

Ответ 7

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