【发布时间】:2017-07-24 11:35:53
【问题描述】:
我想将可变长度(6-60 个字符长)的字符串散列为 32 位 signed integers,以节省 PostgreSQL 中的磁盘空间。
我不想加密任何数据,并且散列函数需要可从 Python 重现和调用。问题是我只能找到产生 无符号整数(如 CityHash)的算法,因此产生的值最多为 2^32 而不是 2^31。
这是我目前所拥有的:
import math
from cityhash import CityHash32
string_ = "ALPDAKQKWTGDR"
hashed_string = CityHash32(string_)
print(hashed_string, len(str(hashed_string)))
max_ = int(math.pow(2, 31) - 1)
print(hashed_string > max_)
【问题讨论】:
-
只是将无符号整数解释为有符号整数?
-
@Ryan 结果必须介于 -2147483648 和 +2147483647 之间。你的建议有什么帮助?你能举个例子吗?
-
减去 2147483648。
-
@Ryan 看起来像一个简单的解决方案。我猜它会导致与原始值相同数量的冲突,并且不会截断更长的哈希?
-
嗯,它可以为您提供 32 位。不过,还有其他几点需要考虑。你如何处理那些让你扔掉它们并只存储它们的哈希值的字符串?
标签: python postgresql hash hashlib signed-integer