You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 06:25:13