哈希函数返回介于-1和1之间的值

时间:2010-10-25 13:57:19

标签: algorithm hash

我正在搜索一个哈希函数,它将任何整数作为输入(正数或负数,但如果这样可以更容易将其约束到int范围),并返回介于-1和1之间的实数。有这样的函数,还是从另一个哈希函数构建它的任何明显方法?

该功能不必是安全的,只要其足够“随机”即可。如果存在C / C ++实现,则加分。

4 个答案:

答案 0 :(得分:5)

  1. 选择整数的任何哈希函数,例如boost::hash
  2. 通过除以整数
  3. 的最大值的一半将结果归一化为2
  4. 减1。

  5. 这是一个快速的黑客演示:

    #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
    

答案 1 :(得分:3)

足够“随机”是什么意思?
您始终可以将整数除以max int值,并获得介于-1和1之间的值。

编辑:

在规范化之前,您可以执行类似

的操作
num = num^397;

然后除以int max。

答案 2 :(得分: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作为负数,会更准确)。

答案 3 :(得分:0)

代码段 double hash(int val) { return val / (double)INT_MAX; } 有错误,因为INT_MIN是-2147483648而INT_MAX是2147483647,所以INT_MIN / INT_MAX&lt; -1

相关问题