代码之家  ›  专栏  ›  技术社区  ›  Benno

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

  •  2
  • Benno  · 技术社区  · 15 年前

    我正在搜索一个散列函数,该函数接受任何整数作为输入(正整数或负整数,但如果这更容易的话,可以将其限制在int范围内),并返回一个介于-1和1之间的实数。是否有这样的函数,或者有任何明显的方法从另一个散列函数构建它?

    只要函数足够“随机”,它就不必是安全的。如果存在C/C++实现,则奖励积分。

    4 回复  |  直到 15 年前
        1
  •  5
  •   aioobe    15 年前
    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
    
        2
  •  3
  •   Itay Karo    15 年前

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

    编辑:

    num = num^397;
    

    然后除以int max。

        3
  •  0
  •   codymanix    15 年前

    再简单不过了。适用于任何非负数。稍加修改,也可以支持负整数。

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

    编辑:这应该适用于所有数字(正数和负数):

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

    是的,它看起来很简单(如果使用 -INT_MIN 对于负数)。

        4
  •  0
  •   Manvel    15 年前

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