如何将hashbytes字符串从sql转换为spark等价字符串



我有一个在sql server 中使用以下select语句的进程

SELECT  HASHBYTES('SHA1', CAST('4100119300' AS NVARCHAR(100))) AS StringConverted

这给你:0x66A2F63C04A3A85347AD2F5CD99F1113F1BDD9CE

我一直在尝试在Spark SQL中重新创建同样的结果,但没有成功。

我在Spark 中尝试了这个sha1(encode('4100119300','utf-8'))

但这样做的结果是:b4cf5ae8ce3dc1673da949cfdf2edfa3fda4

在测试过程中,如果我删除sql区域中的强制转换,结果与spark中的结果相同。我看到的问题是,在spark中,你不能指定字符串的大小,或者可能在这个过程中更改了编码。我已经用nvarchar(100(对sql中的数据进行了散列处理,不可能将其从spark等价物中删除。

有什么建议吗?

您看到这些差异了吗?

SELECT HASHBYTES('SHA1', CAST('4100119300' AS NVARCHAR(100))) AS StringConverted
-- 0x66A2F63C04A3A85347AD2F5CD99F1113F1BDD9CE
SELECT HASHBYTES('SHA1', '4100119300') AS StringConverted
-- 0xB4CF5AAE8CE3DC1673DA4949CFDF2EDFA33FDBA4

为了将varbytes存储为字符串,我使用带有style = 1标志的CONVERT(CAST&CONVERT(

SELECT CONVERT(VARCHAR(100), HASHBYTES('SHA1', '4100119300'), 1) AS StringConverted

正是您想要的。它只是小写的Sparksb4cf5aae8ce3dc1673da4949cfdf2edfa33fdba4,没有0x前缀。

这里要强调的第一件事是Varchar到NVarchar与编码有关,因此您只需要相同的编码来重新生成哈希密钥,即"utf_16_le"编码。

用于再生:

SELECT CONVERT(VARCHAR(254), HASHBYTES('SHA2_512', CONVERT(NVARCHAR(24), '2020-05-27 00:00:00.000', 127)), 2)

你需要这样的东西在Pyspark:

hashlib.sha512('2020-05-27 00:00:00.000'.encode('utf_16_le')).hexdigest().upper()

相关问题链接:在生成SHA-512哈希时,如何在Python中重现SQL NVARCHAR的行为?

希望能有所帮助。感谢

最新更新