均匀分布的哈希函数

Han*_*esh 4 random algorithm hash

我需要一个散列函数,该函数需要几个(例如2或3个)无符号整数作为输入,并返回介于-1和+1之间的浮点值。

这些返回值的集合必须均匀分布。即使输入数字是连续的,该函数的输出序列也必须看起来是随机序列。速度也越快越好,我称之为很多次。

我希望这不是太多要问的:S ...

小智 5

Murmurhash是一个非常好的(强)快速哈希函数,已经对其进行了认真的测试。

http://sites.google.com/site/murmurhash/

虽然它本身并不专用于整数,但可以对其进行快速调整。我有这样一种替代措辞,如果您的话语没有随后记在记忆中,可能会更方便您:

#定义MURMURHASH2A_R 24
#define MURMURHASH2A_MULTIPLIER 0x5bd1e995
#define MURMURHASH2A_SEED 2166136261U //不建议使用种子,因此请使用FNV32_OFFSET_BASIS
#定义murmurhash2a_init(h)做{h = MURMURHASH2A_SEED; }而(0)
#define murmurhash2a_update(h,word)\
做{\
  u_int mmh2ak =(字)* MURMURHASH2A_MULTIPLIER; \
  mmh2ak ^ = mmh2ak >> MURMURHASH2A_R; \
  mmh2ak * = MURMURHASH2A_MULTIPLIER; \
  h * = MURMURHASH2A_MULTIPLIER; \
  h ^ = mmh2ak; \
 }而(0)
#define murmurhash2a_final(h)\
做{\
  h ^ = h >> 13; \
  h * = MURMURHASH2A_MULTIPLIER; \
  h ^ = h >> 15; \
 }而(0)

u_int哈希;
murmurhash2a_init(hash);
murmurhash2a_update(hash,firstint);
murmurhash2a_update(hash,secondint);
[...]
murmurhash2a_final(hash);

显然,这将返回0-2 ^ 32-1。murmurhash网站上有一个64位版本。整数转换为某个范围内的浮点数作为练习(除法)留给读者。