Base16哈希串转Base10整数:DuckDB与Python/TSQL结果不一致
解决DuckDB中MD5哈希转整数与Python/TSQL不一致的问题
问题现象
你已实现Python和TSQL逻辑,将MD5哈希的前15位转为整数,结果一致:
- 哈希值:
BECFB907888C8D4 - 整数结果:
859338226837014740
但DuckDB中使用HASH()函数得到的结果16188616960793580010完全不同,核心原因是用错了函数,而非整数类型位数问题。
错误原因
DuckDB的HASH()函数是对输入字符串本身计算哈希值(用于数据分片、哈希索引等场景),并非将十六进制字符串解析为整数,这和Python的int(hex_str, 16)、TSQL的CONVERT(bigint, CONVERT(VARBINARY, hex_str, 2))逻辑完全无关,因此结果必然不一致。
正确的DuckDB实现
以下两种方法均可得到与Python/TSQL一致的整数结果:
方法1:直接解析十六进制字符串为无符号64位整数
使用DuckDB的str_to_uint64函数,直接将十六进制字符串转为整数:
SELECT md5('Customer1')[:15] AS hash_value, str_to_uint64(md5('Customer1')[:15], 16) AS hash_to_int;
方法2:对齐TSQL逻辑(补0后转字节再转整数)
TSQL中通过在哈希前补0确保为64位长度,DuckDB可复刻此逻辑:
SELECT md5('Customer1')[:15] AS hash_value, cast(hex_to_bytes('0' || md5('Customer1')[:15]) AS BIGINT) AS hash_to_int;
两种方法的输出均为859338226837014740,与Python/TSQL结果一致。
内容的提问来源于stack exchange,提问作者David Clarance
相关产品推荐
相关产品推荐

