微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决Python 的 hash() 函数返回的最大值/最小值

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

Python 的 hash() 函数official documentation 声明:

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

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

来自原始类型值有界的其他语言(例如 C#/Java 的 Int.MaxValue),我知道 Python's likes to think in "unbounded" terms – 即从 int 切换到 long背景。

我是否假设 hash() 函数也是无界的?或者它是有界的,例如映射到 Python 分配给 max/min values of the "int-proper"内容 - 即在 -21474836482147483647 之间?

解决方法

来自文档

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__

,

正如其他人指出的那样,文档中有一个错位的[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] 注释包含在 in the section dedicated to __hash__() 中,而不是专门用于 hash() 的注释。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。