我正在搜索一个哈希函数,它将任何整数作为输入(正数或负数,但如果这样可以更容易将其约束到int范围),并返回介于-1和1之间的实数。有这样的函数,还是从另一个哈希函数构建它的任何明显方法?
该功能不必是安全的,只要其足够“随机”即可。如果存在C / C ++实现,则加分。
答案 0 :(得分: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