Вопрос

Я хочу получить 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, кажется, работает для меня лучше всего.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top