Конвертировать хэшбайты в VarChar
-
08-06-2019 - |
Вопрос
Я хочу получить MD5-хэш строкового значения в SQL Server 2005.Я делаю это с помощью следующей команды:
SELECT HashBytes('MD5', 'HelloWorld')
Однако это возвращает VarBinary вместо значения VarChar.Если я попытаюсь преобразовать 0x68E109F0F40CA72A15E05CC22786F8E6
в VarChar я получаю há ðô§*à\Â'†øæ
вместо того, чтобы 68E109F0F40CA72A15E05CC22786F8E6
.
Существует ли какое-либо решение на основе SQL?
Решение
Я нашел решение в другом месте:
SELECT SUBSTRING(master.dbo.fn_varbintohexstr(HashBytes('MD5', 'HelloWorld')), 3, 32)
Другие советы
SELECT CONVERT(NVARCHAR(32),HashBytes('MD5', 'Hello World'),2)
Использование 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
напрямую.
Вопреки чему Дэвид Найт говорит, что эти две альтернативы возвращают один и тот же ответ в 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(34), HASHBYTES('MD5','Hello World'),1)
(1 для преобразования шестнадцатеричных чисел в строку)
преобразуйте это значение в меньшее и удалите 0x из начала строки по подстроке:
substring(lower(convert(varchar(34), HASHBYTES('MD5','Hello World'),1)),3,32)
точно так же, как то, что мы получаем в C # после преобразования байтов в строку
Имея личный опыт использования следующего кода в хранимой процедуре, которая хэшировала переменную SP, я могу подтвердить, что, хотя это и недокументировано, эта комбинация работает на 100% в соответствии с моим примером:
@var=SUBSTRING(master.dbo.fn_varbintohexstr(HashBytes('SHA2_512', @SPvar)), 3, 128)
Изменение типа данных на varbinary, кажется, работает для меня лучше всего.