恩...或许还有朋友不清楚字符串的哈希函数到底有什么用,这个用处呢,就是将字符串转换成数字,同时让所得数字尽量平均的分布在容器中,换句话说就是让字符串得到相同数字这种情况尽可能少的出现。当然咯...容器太小,内容太多那么再好的算法也没法避免出现冲突 = =b
从网上找到的哈希函数基本上都是C算法的...最后只好从C and Java 算法中整理 and 测试了这些 PHP中的实现方法。有几个经典的算法在 PHP 下会有问题,字符串一长就会全部取 0,那些我就没有再列出来了。代码就看下面咯:
-
function DJBHash($str) // 0.22
-
{
-
$hash = 0;
-
$n = ($str);
-
for ($i = 0; $i <$n; $i++)
-
{
-
$hash += ($hash <<5 ) + ($str[$i]);
-
}
-
return $hash % 701819;
-
}
-
-
function ELFHash($str) // 0.35
-
{
-
$hash = $x = 0;
-
$n = ($str);
-
-
for ($i = 0; $i <$n; $i++)
-
{
-
$hash = ($hash <<4) + ($str[$i]);
-
if(($x = $hash & 0xf0000000) != 0)
-
{
-
$hash ^= ($x>> 24);
-
$hash &= ~$x;
-
}
-
}
-
return $hash % 701819;
-
}
-
-
function JSHash($str) // 0.23
-
{
-
$hash = 0;
-
$n = ($str);
-
-
for ($i = 0; $i <$n; $i++)
-
{
-
$hash ^= (($hash <<5) + ($str[$i]) + ($hash>> 2));
-
}
-
return $hash % 701819;
-
}
-
-
function SDBMHash($str) // 0.23
-
{
-
$hash = 0 ;
-
$n = ($str);
-
-
for ($i = 0; $i <$n; $i++)
-
{
-
$hash = ($str[$i]) + ($hash <<6 ) + ($hash <<16 ) - $hash;
-
}
-
return $hash % 701819;
-
}
-
-
function APHash($str) // 0.30
-
{
-
$hash = 0 ;
-
$n = ($str);
-
-
for ($i = 0; $i <$n; $i++)
-
{
-
if (($i & 1 ) == 0 )
-
{
-
$hash ^= (($hash <<7 ) ^ ($str[$i]) ^ ($hash>> 3 ));
-
}
-
else
-
{
-
$hash ^= ( ~ (($hash <<11 ) ^ ($str[$i]) ^ ($hash>> 5)));
-
}
-
}
-
return $hash % 701819;
-
}