确定Python的hash()返回的值范围

Nat*_*iel 5 python hash

我想将Python hash()函数返回的值映射到0到1范围内的浮点数.在我的系统上,我可以使用

scale = 1.0/(2**64)
print hash(some_object)*scale+0.5
Run Code Online (Sandbox Code Playgroud)

但是,我知道这在32位系统上会有所不同.我很可能永远不会在其他任何地方运行此代码,但我仍然想知道是否有一种方法可以通过编程方式确定Python内置hash()函数可以返回的最大值和最小值.

(顺便说一下,我这样做的原因是我正在开发一个数值模拟,我需要从给定的Numpy数组中始终生成相同的伪随机数.我知道内置的哈希不会有对此最好的统计数据,但速度很快,因此将其用于测试目的很方便.)

Nic*_*tti 8

在Python 2.7中hash()返回一个int,所以sys.maxint应该让你知道它的范围.


jlh*_*jlh 6

Python >= 3.2 具有返回一个命名元组,其中包含具有哈希值位宽的sys.hash_info键。width示例:(为了可读性而添加换行符)

Python 3.7.3 (default, Jul 25 2020, 13:03:44) 
[GCC 8.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.hash_info
sys.hash_info(
    width=64,
    modulus=2305843009213693951,
    inf=314159,
    nan=0,
    imag=1000003,
    algorithm='siphash24',
    hash_bits=64,
    seed_bits=128,
    cutoff=0
)
Run Code Online (Sandbox Code Playgroud)

如图所示,我的机器上的 Python 使用 64 位哈希值。

请注意,如果一个类实现__hash__()但返回超出此位宽度的整数,则它将被截断