Преобразовать функцию hashbytes в varchar
Я хочу получить MD5 хэш строкового значения в SQL Server 2005. Я делаю это с помощью следующей команды:
SELECT HashBytes('MD5', 'HelloWorld')
, то функция возвращает значение типа varbinary вместо varchar значение. Если я попытаюсь преобразовать
0x68E109F0F40CA72A15E05CC22786F8E6 в Варчар я получаю há ðô§*àÂ'†øæ вместо 68E109F0F40CA72A15E05CC22786F8E6.есть ли решение на основе SQL?
7 ответов:
Я нашел решение еще где:
SELECT SUBSTRING(master.dbo.fn_varbintohexstr(HashBytes('MD5', 'HelloWorld')), 3, 32)
использовать
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)
Comments