首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在python中将md5哈希转换为bigint

在python中将md5哈希转换为bigint
EN

Stack Overflow用户
提问于 2021-08-17 12:10:39
回答 1查看 185关注 0票数 0

在postgres中,我使用此函数将md5散列转换为bigint:

代码语言:javascript
运行
复制
SELECT ('x'||substr(md5('text'),1,16))::bit(64)::bigint;

我能够让它对正整数值起作用:

代码语言:javascript
运行
复制
import hashlib

def string2numeric_hash(text):
    return int(hashlib.md5(text).hexdigest()[0:16], 16)

但是对于负值,我得到了错误的结果

有什么想法吗?

EN

Stack Overflow用户

发布于 2021-08-17 12:31:52

使用int(..., 16)转换将不会知道或假设任何关于负值的内容,因为这将需要假设一些特定的整数机器表示,例如使用2的补码来表示负值。

postgres查询之所以有效,是因为您显式地将该值转换为64位有符号整数。

有几种方法可以得到你想要的结果。一种是使用int.from_bytes方法。首先将十六进制字符串转换为字节:

代码语言:javascript
运行
复制
b = bytes.fromhex(hash)

然后使用int.from_bytes--假设您想要小端字节和有符号字节:

代码语言:javascript
运行
复制
int.from_bytes(b, 'little', signed=True)

完整示例:

代码语言:javascript
运行
复制
>>> int.from_bytes(bytes.fromhex(hashlib.md5(b'StackOverflow').hexdigest()[:16]), 'little', signed=True)
8017652491122169732
>>> int.from_bytes(bytes.fromhex(hashlib.md5(b'StackOverflow Rules').hexdigest()[:16]), 'little', signed=True)
-4954873531347136310

或者,正如其他人在评论中正确指出的那样,您可以简单地跳过一步,使用md5.digest()

代码语言:javascript
运行
复制
>>> int.from_bytes(hashlib.md5(b'StackOverflow Rules').digest()[:8], 'little', signed=True)
-4954873531347136310

在这里,您也不一定限于64位整数,所以您不必截断到16位十六进制数字,除非您想要与其他代码完全相同的结果。

票数 1
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68817135

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档