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

ale*_*a87 1 python hash hashtable

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

\n

Python 函数的官方文档指出hash()

\n
\n

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

\n
\n

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

\n

来自其他原始类型值有界的语言(例如 C#\'s/Java\'s Int.MaxValue),我知道Python 喜欢用“无界”术语\xe2\x80\x93 进行思考,即从 切换intlongin的背景。

\n

我是否可以假设该hash()函数也是无界的?或者它是否有界,例如映射到 Python 分配给“int-proper” \xe2\x80\x93的最大/最小值(-2147483648即在 到之间)2147483647

\n

ale*_*a87 6

正如其他人指出的那样,文档中有一个错误的[1]注释,内容如下:

\n
\n

hash() 将从 object\xe2\x80\x99s 自定义hash () 方法返回的值截断为 Py_ssize_t 的大小。

\n
\n

要回答这个问题,我们需要得到这个Py_ssize_t。经过一些研究,它似乎存储在 中sys.maxsize,尽管我希望在这里得到一些反馈。

\n

我最终采用的解决方案是:

\n
import sys\nbits = sys.hash_info.width              # in my case, 64\nprint (sys.maxsize)                     # in my case, 9223372036854775807\n\n# Therefore:\nhash_maxValue = int((2**bits)/2) - 1    # 9223372036854775807, or +sys.maxsize\nhash_minValue = -hash_maxValue          # -9223372036854775807, or -sys.maxsize\n
Run Code Online (Sandbox Code Playgroud)\n

很高兴收到对此 \xe2\x80\x93 的评论/反馈,直到被证明是错误的,这是公认的答案。

\n
\n

[1]该注释包含在专门针对 的章节中,__hash__()而不是专门针对 的章节中hash()

\n