Ответ 1
Я нашел решение else где:
SELECT SUBSTRING(master.dbo.fn_varbintohexstr(HashBytes('MD5', 'HelloWorld')), 3, 32)
Я хочу получить хеш MD5 строкового значения в SQL Server 2005. Я делаю это со следующей командой:
SELECT HashBytes('MD5', 'HelloWorld')
Однако это возвращает VarBinary вместо значения VarChar. Если я попытаюсь преобразовать 0x68E109F0F40CA72A15E05CC22786F8E6
в VarChar, я получаю há ðô§*à\Â'†øæ
вместо 68E109F0F40CA72A15E05CC22786F8E6
.
Есть ли SQL-решение?
Я нашел решение else где:
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
как первый аргумент internaly.
Поскольку вам не нужно 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)
точно так же, как и то, что мы получаем в С# после преобразования байтов в строку
С личным опытом использования следующего кода в хранимой процедуре, в котором хранится переменная SP, которую я могу подтвердить, хотя и недокументированная, эта комбинация работает на 100% согласно моему примеру:
@var=SUBSTRING(master.dbo.fn_varbintohexstr(HashBytes('SHA2_512', @SPvar)), 3, 128)
Изменение типа данных в varbinary кажется лучшим для меня.