Python 的 hash() 函数返回的最大值/最小值



上下文:构建一致性哈希算法

Python的hash()函数的官方文档说明:

返回对象的哈希值(如果有)。哈希值为整数

但是,它没有明确说明函数是否映射到一个整数范围(有最小值和最大值)。

来自其他语言,原始类型的值是有界的(例如c#/Java的Int.MaxValue),我知道Python喜欢以"unbounded"条款——即在后台从int切换到long

我是否可以假设hash()函数也是无界的?或者它是有界的,例如映射到Python给"int- property"的最大/最小值所赋的值。-即在-21474836482147483647之间?

正如其他人指出的那样,文档中有一个放错地方的[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__

相关内容

  • 没有找到相关文章

最新更新