我想创建一个哈希函数,它将接收字符串并在具有预定义“比例”的数组中输出相应的值。例如,如果我的数组包含值:
[0] => "output number 1"
[1] => "output number 2"
[2] => "output number 3"
然后,对于任何给定的字符串,散列函数int H(string)
应仅返回范围0
和2
中的值(输入字符串将始终返回相同的键)。
事情是,我希望它也能按照预定义的比例进行判断,例如
给定字符串的85%
将标记为0
,10%
标记为1
,5%
标记为2
。如果有功能可以模拟正常分布,那就更好了。
我也希望它能够快速运行。有人能指出我如何在PHP中解决这个问题的正确方向吗?我相信我不是第一个问这个问题的人,但我在SO上挖了一个小时。
修改
到目前为止我所做的是在c
中构建了哈希函数。它没有比例进行上述散列(仍然不熟悉php):
int StringFcn (const void *key, size_t arrSize)
{
char *str = key;
int totalAsciiVal = 0;
while(*str)
{
totalAsciiVal += *str++;
}
return totalAsciiVal % arrSize;
}
答案 0 :(得分:0)
做这样的事情怎么样:
// Hash the string so you can pretty much guarantee it will have a number in it and it is relatively "random"
$hash = sha1($string);
// Iterate through string and get ASCII values
$chars = str_split($hash);
$num = 0;
foreach ($chars as $char) {
$num += ord($int);
}
// Get compare modulo 100 of the number
if ($num % 100 < 85) {
return 0;
}
if ($num % 100 < 95) {
return 1;
}
return 2;
修改强>
不是使用sha1
进行散列,而是使用crc32直接获得足够大的整数(感谢评论中的@nivrig)。
// Convert string to integer
$num = crc32($string);
// Get compare modulo 100 of the number
if ($num % 100 < 85) {
return 0;
}
if ($num % 100 < 95) {
return 1;
}
return 2;