来自Python hash()函数的正整数

Cra*_*een 19 python hash cross-platform

我想使用Python hash()函数从对象中获取整数哈希值.但内置hash()可以给出负值,我只想要积极.我希望它能够在32位和64位平台上合理地工作.

即,在32位的Python,hash()可以在范围返回一个整数-2**312**31 - 1.在64位系统中,hash()可在范围内返回一个整数-2**632**63 - 1.

但我想的范围内的散列02**32-1在32位系统,以及02**64-1在64位的系统.

将哈希值转换为32位或64位目标平台范围内的等效正值的最佳方法是什么?

(上下文:我正在尝试创建一个新的random.Random样式类.根据random.Random.seed()文档,种子"可选参数x可以是任何可清除对象."所以我想复制该功能,除了我的种子算法不能处理负整数值,只有正数.)

fal*_*tru 19

使用sys.maxsize:

>>> import sys
>>> sys.maxsize
9223372036854775807L
>>> hash('asdf')
-618826466
>>> hash('asdf') % ((sys.maxsize + 1) * 2)
18446744073090725150L
Run Code Online (Sandbox Code Playgroud)

替代使用ctypes.c_size_t:

>>> import ctypes
>>> ctypes.c_size_t(hash('asdf')).value
18446744073090725150L
Run Code Online (Sandbox Code Playgroud)

  • 如果`sys.maxsize`是`2 ** 32`或`2 ** 64`那将是很好,简单和可靠的。但是sys.maxsize实际上是2 ** 31-1或2 ** 63-1 (2认同)
  • @CraigMcQueen,我添加了另一种方法。一探究竟。 (2认同)

Voo*_*Voo 7

sys.maxsize由于显而易见的原因,仅使用是错误的(它是`2* n-1 而不是 2 *n),但修复很容易:

h = hash(obj)
h += sys.maxsize + 1
Run Code Online (Sandbox Code Playgroud)

出于性能原因,您可能希望将 sys.maxsize + 1 拆分为两个单独的分配,以避免为大多数负数临时创建长整数。虽然我怀疑这会很重要