为什么 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?还设置了哪些其他选项,例如排序规则等?
知道为什么 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?还设置了哪些其他选项,例如排序规则等?