Преобразовать функцию hashbytes в varchar



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



SELECT HashBytes('MD5', 'HelloWorld')


, то функция возвращает значение типа varbinary вместо varchar значение. Если я попытаюсь преобразовать 0x68E109F0F40CA72A15E05CC22786F8E6 в Варчар я получаю há ðô§*àÂ'†øæ вместо 68E109F0F40CA72A15E05CC22786F8E6.

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



да

573   7  

7 ответов:

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

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 для преобразования шестнадцатеричной строки)

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

Comments

    Ничего не найдено.