上下文:构建一致性哈希算法
Python的hash()
函数的官方文档说明:
返回对象的哈希值(如果有)。哈希值为整数
但是,它没有明确说明函数是否映射到一个整数范围(有最小值和最大值)。
来自其他语言,原始类型的值是有界的(例如c#/Java的Int.MaxValue
),我知道Python喜欢以"unbounded"条款——即在后台从int
切换到long
。
我是否可以假设hash()
函数也是无界的?或者它是有界的,例如映射到Python给"int- property"的最大/最小值所赋的值。-即在-2147483648
到2147483647
之间?
正如其他人指出的那样,文档中有一个放错地方的[1]注释:
hash()截断对象自定义hash返回的值()方法设置Py_ssize_t的大小。
回答这个问题,我们需要得到这个Py_ssize_t
。经过一番研究,似乎它存储在sys.maxsize
中,尽管我希望这里有一些反馈。
我最终采用的解决方案是:
import sys
bits = sys.hash_info.width # in my case, 64
print (sys.maxsize) # in my case, 9223372036854775807
# Therefore:
hash_maxValue = int((2**bits)/2) - 1 # 9223372036854775807, or +sys.maxsize
hash_minValue = -hash_maxValue # -9223372036854775807, or -sys.maxsize
很高兴收到关于这个问题的评论/反馈——除非被证明是错误的,这是公认的答案。
[1]该注释包含在__hash__()
专用的部分中,而不是hash()
专用的部分
从文档
hash()
将截断对象自定义__hash__()
返回的值方法设置为Py_ssize_t的大小。这通常是8字节64位构建,32位构建为4字节。如果一个对象是__hash__()
必须在不同位大小的构建上互操作,一定要检查所有支持构建的宽度。一个简单的方法是python -c "import sys; print(sys.hash_info.width)
"。
更多细节可在这里找到https://docs.python.org/3/reference/datamodel.html#object.__hash__