我正在比较 Azure Databricks 和 SQL Server 之间的哈希值,但对于非 ASCII 字符却得到了一些意外结果。我将问题范围缩小到了“破折号”字符 ( https://www.fileformat.info/info/unicode/char/2014/index.htm )。
在T-SQL中,字符可以用NCHAR(8212)
表示,这通过以下方式确认
CASE WHEN '—' = NCHAR(8212) THEN 1 ELSE 0 END
使用HASHBYTES
函数和algorithm='SHA2_512'
对字符进行哈希处理
CONVERT(VARCHAR(128),HASHBYTES('SHA2_512', CONVERT(VARCHAR(MAX), NCHAR(8212))), 2)
)
结果值:
CABC0F199E27BC609E318E283A7CC3882599B1538EE7794082FD17AA6F4B32A3FF6B7169D87CA21D0DFD122C4D4D54E4CC40BF1F940489A2561C725A362B8A80
.
使用字符串表示形式 '\u2014'
在 Azure Databricks 中执行相同的流程。并通过以下方式确认这一点
CASE WHEN '—' = '\u2014' THEN 1 ELSE 0 END
将 SHA2
函数应用于 bitLength=512
的字符
SHA2('\u2014', 512)
结果
48bf9ce5ab3755bf779032043c2ff6b0b075ec3407b3e473872ea2b059165a86bd70e0854ff6e9d05f1677a77fefcce7c6e3d73d1f3d9dd6488a2fecf041bb89
在在线编辑器中粘贴字符,例如 https://emn178.github.io/online-tools/sha512.html , https://www.conversion-tool.com/sha512/ , https://codebeautify.org/sha512-hash-generator和 https://sha512.online/ ,结果始终如一
48bf9ce5ab3755bf779032043c2ff6b0b075ec3407b3e473872ea2b059165a86bd70e0854ff6e9d05f1677a77fefcce7c6e3d73d1f3d9dd6488a2fecf041bb89
与 Azure Databricks 中的值相同。
这让我相信问题出在 SQL Server 上。对于如何让 SQL Server '正确' 地散列此字符,有什么建议吗?
最佳答案
哈希值基于字符串的二进制表示。
以下内容
SELECT
CONVERT(VARCHAR(128),
HASHBYTES('SHA2_512', CONVERT(VARCHAR(MAX), NCHAR(8212) COLLATE LATIN1_GENERAL_100_CI_AS_SC_UTF8))
, 2)
返回您要查找的哈希值(使用 UTF8 排序规则)。
SELECT HASHBYTES('SHA2_512', 0xE28094)
一些示例结果(显示方法 A 产生所需的二进制结果进行哈希)
SELECT
A = CONVERT(VARBINARY(MAX), CONVERT(VARCHAR(MAX), NCHAR(8212) COLLATE LATIN1_GENERAL_100_CI_AS_SC_UTF8)),
B = CONVERT(VARBINARY(MAX), CONVERT(VARCHAR(MAX), NCHAR(8212) COLLATE LATIN1_GENERAL_100_CI_AS)),
C = CONVERT(VARBINARY(MAX), NCHAR(8212))
返回
关于sql-server - 如何在 SQL Server 中正确哈希 'em dash' 字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75089394/