【问题标题】:为什么 SQL Server HASHBYTES 与 Oracle STANDARD_HASH 的工作方式不同?
【发布时间】:2022-01-23 06:53:06
【问题描述】:

知道为什么 SQL Server 和 Oracle 中的两个散列函数在散列不间断空格字符时会产生不同的结果吗?

Oracle select standard_hash('a ', 'MD5') from dual; 导致 25EF28EB5A5BE667C6222418E9E27E8E 与 SQL select HASHBYTES ('MD5','a '); 不匹配导致 CE8F03020C81133B3A082F8051EB9FF6。注意输入 'a' 后面的空格是一个不间断的空格字符。

有什么好的资料可以说明差异吗?

【问题讨论】:

  • 从文档中,“可选的方法参数让您指定要使用的哈希算法的名称。有效的算法是 SHA1、SHA256、SHA384、SHA512 和 MD5。如果省略此参数,则使用 SHA1”SS 是否使用相同?
  • “请注意输入 'a' 后面的空格是一个不间断的空格字符。” 与其说明这一点,不如包括实际再现该字符的代码,例如as'a' + CONVERT(varchar(1),0xA0)
  • 相同的排序规则?
  • 我粘贴了不间断的空格字符,所以不需要手动编码。
  • @OldProgrammer,我在两边都指定了“MD5”,但顺便说一下,SHA2-512 或任何散列算法也会出现同样的分歧。

标签: sql-server oracle hash


【解决方案1】:

这似乎是字符集或“排序规则”问题,其中 Oracle 采用 UTF-8 而 SQL Server 采用拉丁语 1252。我的解决方案是在计算哈希之前在 Oracle 中将值转换为 Windows Latin-1252: select STANDARD_HASH(CONVERT('a ','WE8MSWIN1252'), 'MD5') from dual.

为了找到我的排序规则/字符集,我在 SQL Server 中使用了SELECT collation_name FROM sys.databases WHERE name = 'MY_DB_NAME';,在 Oracle 中使用了select * from nls_database_parameters where parameter='NLS_CHARACTERSET';

【讨论】:

  • 总是小事
  • 你也可以通过在对字符串进行哈希处理时将字符串编码为 UTF-8 来实现 SQL Server 中的 Oracle 结果,例如:select HASHBYTES ('MD5', cast(N'a' + nchar(160) collate LATIN1_GENERAL_100_CI_AS_SC_UTF8 as varchar(3)));
  • 或者你可以在两边都使用nvarchar来获得UTF-16。另请注意,有服务器、数据库和列排序规则,它们用于不同的事情
【解决方案2】:

首先,您需要确定哪个实际上产生了“不同”的结果:

使用您最喜欢的搜索引擎查找在线哈希生成器和测试结果。

外部资源

https://passwordsgenerator.net/md5-hash-generator/ - 99020CB24BD13238D907C65CC2B57C03

https://www.md5hashgenerator.com/ - 99020cb24bd13238d907c65cc2b57c03

https://www.miraclesalad.com/webtools/md5.php - 99020cb24bd13238d907c65cc2b57c03

SQL 服务器

select HASHBYTES ('MD5', 'a ')

SQL Server 2014 SP3 (12.0.6024.0) - 0x99020CB24BD13238D907C65CC2B57C03

SQL Server 2019 (15.0.2080.9) - 0x99020CB24BD13238D907C65CC2B57C03

Oracle(使用https://dbfiddle.uk/

select standard_hash('a ', 'MD5') from dual;

甲骨文 21c - 0x99020CB24BD13238D907C65CC2B57C03

Oracle 18c - 0x99020CB24BD13238D907C65CC2B57C03

Oracle 11gR2 -“ORA-00904:“STANDARD_HASH”:无效标识符”

结论

您可以看到您的 Oracle 生成的答案甚至与其他 Oracle 答案不同。您正在运行什么版本的 Oracle?还设置了哪些其他选项,例如排序规则等?

【讨论】:

    猜你喜欢
    • 2023-03-10
    • 2021-01-05
    • 2021-11-18
    • 2020-11-27
    • 1970-01-01
    • 2014-09-04
    • 2018-02-23
    • 1970-01-01
    • 2016-01-30
    相关资源
    最近更新 更多