为什么 SQL Server HASHBYTES 与 Oracle STANDARD_HASH 的工作方式不同?

Why does SQL Server HASHBYTES work differently from Oracle STANDARD_HASH?

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

Oracle select standard_hash('a ', 'MD5') from dual; 结果为 25EF28EB5A5BE667C6222418E9E27E8E,不匹配 SQL select HASHBYTES ('MD5','a '); 结果为 CE8F03020C81133B3A082F8051EB9FF6。注意输入 'a' 后的 space 是一个不间断的 space 字符。

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

这似乎是一个字符集或“归类”问题,其中 Oracle 使用 UTF-8,SQL 服务器使用 Latin 1252。我的解决方案是将值转换为 Windows在计算哈希之前 Oracle 中的 Latin-1252:select STANDARD_HASH(CONVERT('a ','WE8MSWIN1252'), 'MD5') from dual.

为了找到我的 collation/character 集合,我在 SQL Server 中做了 SELECT collation_name FROM sys.databases WHERE name = 'MY_DB_NAME';,在 Oracle 中做了 select * from nls_database_parameters where parameter='NLS_CHARACTERSET';

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

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

外部资源

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 服务器 2014 SP3 (12.0.6024.0) - 0x99020CB24BD13238D907C65CC2B57C03

SQL 服务器 2019 (15.0.2080.9) - 0x99020CB24BD13238D907C65CC2B57C03

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

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

甲骨文 21c - 0x99020CB24BD13238D907C65CC2B57C03

甲骨文 18c - 0x99020CB24BD13238D907C65CC2B57C03

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

结论

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