名字成分分析的小玩意
昨天找一些 SNS 的案例,无意中回到一年多前曾留意过的 Geekaa.com,里面那个名字成分分析挺有意思的,它可以根据输入的名字 (里面是用帐户名) 来计算出你的成分,就类似人家街上算命卜卦的老先生一样,当然跟人家那样引经据典的忽悠你不同,也很无厘头,但相信还是一个很有趣的点子吧...

网上也有很多类似的算法,这里我就贴出一份我自己修改过的,让大家参考参考 :)
- 把名字作散列运算 (比如 MD5, SHA1 等)

- 把散列结果分段,一部分作为计算成分索引值,一部分作为计算成分的含量值

- 组合结果,输出
以下是源代码
$elements = array(
'尸毒',
'御宅气',
'高手高手高高手',
'杂鱼',
'高频杂讯',
'黑暗',
'死灵怨影',
'三锂水晶',
'空间扭曲',
'时空断层',
'微型黑洞',
'微波雷射',
'化尸水',
'王水',
);
function analyze($name)
{
global $elements;
$name = strtoupper($name);
$hash = md5($name);
$chunks = str_split($hash, 2);
$count = count($chunks);
$elementsCount = count($elements);
$result = array();
$total = 0;
for ($i = 0; $i < $count; $i += 2) {
$key = hexdec('0x' . $chunks[$i]) % $elementsCount; // 计算出索引值
$value = pow(hexdec('0x' . $chunks[$i + 1]), 3); // 计算出含量值, pow(3) 是为了增大差距
if (!isset($result[$key])) {
$result[$key] = 0;
}
$result[$key] += $value;
$total += $value;
}
foreach ($result as &$value) {
$value = number_format($value / $total * 100, 2);
}
arsort($result);
return $result;
}
function output($result)
{
global $elements;
echo '<ul>';
foreach ($result as $key => $value) {
if ($value > 0.1) { // 含量值太低就不用显示出来了
echo '<li>' . $elements[$key] . ' : ' . $value . '%</li>';
}
}
echo '</ul>';
}
$result = analyze('Bun');
output($result);