2010-10-25 138 views
2

我正在寻找一个散列函数,它将任何整数作为输入(正数或负数,但如果这可以使它更容易受限于int范围),以及返回一个介于-1和1之间的实数。是否有这样一个函数,或者从另一个哈希函数中构建它的任何显而易见的方法?返回-1和1之间的值的散列函数

该功能不一定非常安全,只要它具有足够的“随机性”即可。如果存在C/C++实现,则为奖励积分。

回答

5
  1. 挑选为整数任何哈希函数,如boost::hash
  2. 正常化的结果为2通过由整数
  3. 减1.

的最大值的一半除以

这里是一个快速入门示范:

#include<stdio.h> 

double inthash(unsigned int key) 
{ 
    key += (key << 12); 
    key ^= (key >> 22); 
    key += (key << 4); 
    key ^= (key >> 9); 
    key += (key << 10); 
    key ^= (key >> 2); 
    key += (key << 7); 
    key ^= (key >> 12); 
    return key/2147483647.5 - 1; 
} 

void main() 
{ 
    printf("%f\n", inthash(1)); 
    printf("%f\n", inthash(2)); 
    printf("%f\n", inthash(3)); 
    printf("%f\n", inthash(10000)); 
    printf("%f\n", inthash(10001)); 
} 

输出:

0.368240 
-0.263032 
-0.892034 
-0.428394 
-0.150713 
3

你是什么意思足够“随机”?
你总是可以划分你整的最大int值,并得到-1之间的值1

编辑:

正常化之前,你可以这样做

num = num^397; 

,然后除以int max。

+0

通过随机我的意思是函数的输出应该看起来像一串随机数,或者类似的输入不应该产生类似的输出或任何其他合理的随机性定义。 – Benno 2010-10-25 14:05:26

+0

你可以将你的号码提升到某个素数的能力,然后根据上面的规范化它,它会更“随机”。 – 2010-10-25 14:21:44

0

没有什么比这更简单。适用于任何非负数。只需稍作修改,也可以支持负整数。

double hash(int val) 
{ 
    return val/((double)INT_MAX/2.0) - 1.0; 
} 

编辑:这应该为所有的数字(正面和负面的)工作:

double hash(int val) 
{ 
    return val/(double)INT_MAX; 
} 

是的,这是微不足道的,因为它看起来(这将是更准确的,如果你使用-INT_MIN为负数)。

+0

我认为这与Itay的答案有相同的错误,即输入的结构被完全保留(类似的输入给出类似的输出),所以它不是“随机的”就足够了。 – Benno 2010-10-25 14:14:20

0

代码片段 double hash(int val) { return val/(double)INT_MAX; } 有问题,因为INT_MIN是-2147483648而INT_MAX是2147483647,所以INT_MIN/INT_MAX < -1。