哈希说明

Numba 支持内置的 hash() 函数,它通过简单地调用所提供参数上的 __hash__() 成员函数来实现这一点。这使得为新类型添加哈希支持变得轻而易举,因为所需要的只是应用扩展 API overload_method() 装饰器来重载一个函数,以计算注册到该类型 __hash__() 方法的新类型的哈希值。例如

from numba.extending import overload_method

@overload_method(myType, '__hash__')
def myType_hash_overload(obj):
    # implementation details

实现

Numba 哈希函数的实现严格遵循 Python 3 的规范。唯一的例外是,对于哈希 Unicode 和字节(内容长度超过 sys.hash_info.cutoff 的情况),唯一支持的算法是 siphash24(CPython 3 中的默认算法)。因此,在所述的默认条件下,Numba 将与所有支持类型的 Python 3 哈希值匹配。

Unicode 哈希缓存差异

Numba 和 CPython 的 Unicode 字符串内部表示都含有一个 hash 成员,用于缓存字符串的哈希值。在计算哈希值之前,总是会检查此成员,目的是直接从缓存中提供值,因为这样做成本要低得多。Numba 的 Unicode 字符串哈希缓存实现方式与 CPython 的类似。唯一值得注意的行为变化(其唯一影响是性能上微小的潜在变化)是,Numba 总是会在 nopython mode 中创建的 Unicode 字符串被装箱以供 Python 重用时立即计算并缓存其哈希值,这在某些情况下比 CPython 更积极,CPython 可能会根据创建方法延迟对新 Unicode 字符串的哈希计算。还需要注意的是,Numba 在将 Unicode 字符串从 CPython 内部表示解箱到自己的表示时,会复制 CPython 内部表示的 hash 成员,这样就不会重新计算已关联哈希值的字符串的哈希值。

PYTHONHASHSEED 的兼容性

PYTHONHASHSEED 环境变量可用于为 CPython 哈希算法设定种子,例如为了可重现性。Numba 的哈希实现直接读取 CPython 哈希算法的内部状态,因此 PYTHONHASHSEED 的影响会在 Numba 的哈希实现中重现。