首页 > 解决方案 > 如何比较 MS SQL 和 Snowflake 中 SHA-256 函数返回的十六进制编码字符串?

问题描述

我正在 Snowflake 和 SQL Server 中寻找返回相同 SHA-256 字符串值的哈希函数。因此,我决定比较Snowflake 的sha2 (SHA-256) 函数和 SQL Server 的 HASHBYTES (SHA2_256) 返回的十六进制编码字符串。以下是我提出的查询:

雪花:

SELECT sha2(TO_VARCHAR(ABS(12.5)), 256)
Returns: b902cc4550838229a710bfec4c38cbc7eb11082367a409df9135e7f007a96bda

SQL 服务器:

SELECT CONVERT(VARCHAR(64), HASHBYTES('SHA2_256', CAST(12.5 AS varbinary(64))), 2) as tmp
Returns: 48DCB7B99301A1AA2D8A74637173AD8A3282844983F39ED7AB079A2ADF08FEEA

它们似乎返回不同的哈希字符串。这些函数是否确实有不同的底层实现或查询有问题?

我怀疑我对 SQL Server 的查询可能有错误。

标签: sql-serverhashcryptographysnowflake-cloud-data-platform

解决方案


通过此示例,我在 SQL Server 和 Snowflake 中得到了相同的结果:

SQL 服务器:

SELECT UPPER(master.dbo.fn_varbintohexsubstring(0, HashBytes('SHA2_256', 'Hello World'), 1, 0))
SELECT CONVERT(VARCHAR(MAX), HASHBYTES('SHA2_256','Hello World'), 2);

SELECT UPPER(master.dbo.fn_varbintohexsubstring(0, HashBytes('SHA2_256', '12.5'), 1, 0))
SELECT CONVERT(VARCHAR(MAX), HASHBYTES('SHA2_256','12.5'), 2);

雪花:

SELECT sha2(TO_VARCHAR('Hello World'), 256);

SELECT sha2(TO_VARCHAR('12.5'), 256);

两者的结果:

Hello World: A591A6D40BF420404A011733CFB7B190D62C65BF0BCDA32B57B277D9AD9F146E 
12.5: B902CC4550838229A710BFEC4C38CBC7EB11082367A409DF9135E7F007A96BDA

推荐阅读