求字符串均匀散列 简单方法

justicesun 2010-09-09 01:39:29
目的:邮件地址散列到N个箱 (N是正整数)

我的实现:

<?php
$email;
$n;
$md5 = str_split(md5($email));
$md5_sum = 0;
foreach ($md5 as $row){
$md5_sum += ord($row);
}
$key = $md5_sum%$n;

?>


请问有没有更简单点儿的实现方法?

好久没来了,只有28分咯~
...全文
239 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
justicesun 2010-09-09
  • 打赏
  • 举报
回复
哦...也就是N越大,越不均匀是吧... good

[Quote=引用 2 楼 amani11 的回复:]
在均匀上,还得下点功夫

你的算法$md5_sum 对 $n 取余数本身分布并不均匀


例如,理论上的$md5_sum至大值为102*32,大约3000多,至小值48*32,大约1500多

就算md5字符串中,0—9,a—f出现的频率一样。。。$md5_sum也只能随机映射到102*32-48*32基数的集合中
[/Quote]
amani11 2010-09-09
  • 打赏
  • 举报
回复
在均匀上,还得下点功夫

你的算法$md5_sum 对 $n 取余数本身分布并不均匀


例如,理论上的$md5_sum至大值为102*32,大约3000多,至小值48*32,大约1500多

就算md5字符串中,0—9,a—f出现的频率一样。。。$md5_sum也只能随机映射到102*32-48*32基数的集合中
xuzuning 2010-09-09
  • 打赏
  • 举报
回复
执行时间 28微秒,估计没有多大优化空间了

md5($email) ==> md5($email, 1)
可缩短至 17微秒

21,886

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧