php如何创建一个适当的哈希函数来处理给定的字符串

时间:2013-02-22 23:36:20

标签: php hash

我想创建一个哈希函数,它将接收字符串并在具有预定义“比例”的数组中输出相应的值。例如,如果我的数组包含值:

[0] => "output number 1"
[1] => "output number 2"
[2] => "output number 3"

然后,对于任何给定的字符串,散列函数int H(string)应仅返回范围02中的值(输入字符串将始终返回相同的键)。

事情是,我希望它也能按照预定义的比例进行判断,例如 给定字符串的85%将标记为010%标记为15%标记为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;
}

1 个答案:

答案 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;