sql-server - 如何在 SQL Server 中正确哈希 'em dash' 字符?

标签 sql-server sha512

我正在比较 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-generatorhttps://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 排序规则)。

You are after

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))

返回

<表类=“s-表”> <标题> 一个 B C <正文> 0xE28094 0x97 0x1420

关于sql-server - 如何在 SQL Server 中正确哈希 'em dash' 字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75089394/

相关文章:

php - 使用 Codeigniter 实现 SHA 512 哈希

java - 如何在 Java 中使用 SHA-512 对密码进行哈希处理?

SHA-512 的 C++ 实现不起作用

sql - 从表 SQL 中查找 Maximum(table.column1,table.column2,table.column3,...) 为 'MaximumValue'

sql-server - FSharp.Data.SqlProvider 很慢

php - 表的 SQL 重新排序索引

java - Java 中的 crypt(3) $6$ 密码哈希算法(基于 SHA-512)?

sql - 如何验证 SQL Server 版本,包括版本、服务包、累积更新和补丁

c# - 如何在不使用 SMO 的情况下在 C# 中备份数据库 (SQL Server 2008)?

php - SHA512带盐的iOS专用