如何在Snowflake中将哈希字符串转换为整数



我正在尝试获取一个十进制值的哈希并将其转换为整数。但是查询会导致以下错误:

Numeric value 'b902cc4550838229a710bfec4c38cbc7eb11082367a409df9135e7f007a96bda' is not recognized

SELECT (CAST(sha2(TO_VARCHAR(ABS(12.5)), 256) AS INTEGER) % 100) AS temp_value

在Snowflake中,将哈希字符串转换为整数的正确方法是什么?我不能使用任何用户定义的函数。并且必须使用Snowflake本地函数。

哈希值包含字母字符,因此它将抛出错误

SELECT --(CAST(
sha2(
TO_VARCHAR(
ABS(12.5)), 256)-- AS INTEGER) % 100) 
AS temp_value;

您需要将哈希编码中的十六进制值转换为int。

我还没有找到一个内置在Snowflake中的函数可以做到这一点,但如果你看看下面的链接,它将解释如何创建一个javascript函数来为你进行转换:https://snowflakecommunity.force.com/s/article/faq-does-snowflake-have-a-hex-to-int-type-function

如果你使用链接中的函数,那么你的代码就会变成这样:

SELECT (CAST(js_hextoint(sha2(TO_VARCHAR(ABS(12.5)), 256)) AS INTEGER) % 100) AS temp_value

恐怕我还没能测试上面的代码,所以可能有一个括号放错了地方。。。

您有一个56位的十六进制数字。它不适合38的最大数字精度。您可以使用浮点数,但这将失去精度。

create or replace function CONV(VALUE_IN string, OLD_BASE float, NEW_BASE float)
returns string
language javascript
as
$$
// Usage note: Loses precision for very large inputs
return parseInt(VALUE_IN, Math.floor(OLD_BASE).toString(Math.floor(NEW_BASE)));
$$;
select conv('b902cc4550838229a710bfec4c38cbc7eb11082367a409df9135e7f007a96bda', 16, 10);
--Returns 8.368282050700398e+76

对于十六进制到整数,请检查雪花是否具有'hex'到'int'类型的本机函数?。我的猜测是,大多数查看这个问题(1千次浏览(的人都在寻找这个问题。

但这个特定的问题想要将sha2摘要转换为整数以进行比较。我对这个具体问题的建议是";不要"。

这是因为问题中的十六进制字符串表示整数83682820507003986697271120393377917644380327831689630185856829040117055843290,即使Java的BigInteger也无法处理它。

相反,只需比较字符串/二进制来检查值是否匹配。

最新更新