在postgres中,我使用此函数将md5散列转换为bigint:
SELECT ('x'||substr(md5('text'),1,16))::bit(64)::bigint;
我能够让它对正整数值起作用:
import hashlib
def string2numeric_hash(text):
return int(hashlib.md5(text).hexdigest()[0:16], 16)
但是对于负值,我得到了错误的结果
有什么想法吗?
发布于 2021-08-17 12:31:52
使用int(..., 16)
转换将不会知道或假设任何关于负值的内容,因为这将需要假设一些特定的整数机器表示,例如使用2的补码来表示负值。
postgres查询之所以有效,是因为您显式地将该值转换为64位有符号整数。
有几种方法可以得到你想要的结果。一种是使用int.from_bytes
方法。首先将十六进制字符串转换为字节:
b = bytes.fromhex(hash)
然后使用int.from_bytes
--假设您想要小端字节和有符号字节:
int.from_bytes(b, 'little', signed=True)
完整示例:
>>> 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()
:
>>> int.from_bytes(hashlib.md5(b'StackOverflow Rules').digest()[:8], 'little', signed=True)
-4954873531347136310
在这里,您也不一定限于64位整数,所以您不必截断到16位十六进制数字,除非您想要与其他代码完全相同的结果。
https://stackoverflow.com/questions/68817135
复制相似问题