哈希说明
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 的哈希实现中重现。