我见过很多与关键词匹配的例子。然而,这些通常用于其他语言和/或来自
select
的值的转换,我无法适应我的情况。
我正在将 C# 中的哈希字符串转换为 Base64(之前它存储为十六进制)。正如 the fiddle 所示,十六进制结果正是以下 SQL 产生的结果。
declare @Pass as varchar(max) = 'abc'
declare @HexPass as varchar(max) = convert(varchar(max), hashbytes('SHA2_512', @Pass), 2)
select @Pass as Plain, @HexPass as HEX
但是,当用新的
Convert.ToHexString(hash)
替换旧的 Convert.ToBase64String(hash)
时,输出会发生变化,我还没有找到在 SQL 中引入相应转换的方法。
在研究过程中,我在几个实例中偶然发现了一个依赖于
xs:base64Binary
的解决方案(例如这里、这里、绝对在这里等)。
但是,我无法弄清楚如何遵循上面应用
@HexPass
的语法。我已经尝试了“无数”的事情,在该 shcema 表达式中连接字符串,替换它的一部分等等。我不会列出我尝试过的所有组合,但现在已经过去了好几个小时了,我开始感觉到我'我可能沙哑地叫错了树。
您的 C# 代码正在使用
Encoding.UTF8.GetBytes
。
你可以使用
declare @Pass as nvarchar(max) = N'abc'
select
cast('' as xml).value(
'xs:base64Binary(sql:column("v.col"))', 'varchar(max)'
) as Base64Encoding
from (values(hashbytes('SHA2_512', CAST(@Pass COLLATE Latin1_General_100_CI_AI_SC_UTF8 AS VARCHAR(MAX))))) v(col)
这回来了
3a81oZNherrMQXNJriBBMRLm+k6JqX6iCp7u5ktV05ohkpkqJ0/BqDa6PCOj/uu9RU1EI2Q86A4qmslPpUyknw==
Latin1_General_100_CI_AI_SC_UTF8
对于 abc
没有任何区别,但可以用于其他字符串