7.12。哈希 的注意事项

原文: http://numba.pydata.org/numba-doc/latest/developer/hashing.html

Numba 支持内置 hash() ,只需在提供的参数上调用__hash__()成员函数即可。这使得为​​新类型添加哈希支持变得微不足道,因为所需要的是应用扩展 API overload_method()装饰器来重载函数以计算注册到类型的__hash__()方法的新类型的哈希值。例如:

  1. from numba.extending import overload_method
  2. @overload_method(myType, '__hash__')
  3. def myType_hash_overload(obj):
  4. # implementation details

7.12.1。实施

Numba 散列函数的实现严格遵循 Python 3 的实现。唯一的例外是对于散列 Unicode 和字节(对于长于sys.hash_info.cutoff的内容),唯一支持的算法是siphash24(CPython 3 中的默认值)。因此,Numba 将在所描述的默认条件下匹配所有支持类型的 Python 3 哈希值。 Python 2 散列支持设置为遵循 Python 3,类似的默认值是为此目的进行硬编码的,包括,或许最明显的是,sys.hash_info.cutoff设置为零。

7.12.1.1。 Unicode 哈希缓存差异

Numba 和 CPython Unicode 字符串内部表示都有一个hash成员用于缓存字符串的哈希值。在计算哈希值之前总是检查该成员,只需从缓存中提供值,因为这样做要便宜得多。 Numba Unicode 字符串哈希缓存实现的行为方式与 CPython 的相似。唯一值得注意的行为改变(其唯一影响是性能的微小潜在变化)是 Numba 总是计算并缓存在nopython mode中创建的 Unicode 字符串的哈希值,这些字符串在盒装时可以在 Python 中重用,这太过于渴望在某些情况下,与 CPython 相比,它可能会延迟根据创建方法散列新的 Unicode 字符串。还应该注意的是,当 Numba 将它们拆分为自己的表示时,Numba 会在 CPython 内部表示的hash成员中复制它们,以便不重新计算已经具有与之关联的散列值的字符串的散列。

7.12.1.2。 PYTHONHASHSEED 的住宿

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