PHP-php hash算法使用
在很多算法中都有提到使用hash算法。请使用的hash算的同志来几个使用例子。
比如:在memcache中分key存储。主机分布式选择主机的算法
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
在很多算法中都有提到使用hash算法。请使用的hash算的同志来几个使用例子。
比如:在memcache中分key存储。主机分布式选择主机的算法
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(4)
在实际使用中,我们用得hash用得比较多的地方是在数据分表存储上,比如存贮用户信息,当用户数量太多(如达到千万级别),数量量太大时,我们会根据用户名username使用hash算法得出0-N的一个数值,将用户信息分散存储到N个表中,如增加用户信息示例代码如下:
以下是PHP CRC32散列,偷师某位高人:
<?php
//范围:00-63
function crc_hash(&$keyword,$n=64)
{
$hash = crc32($keyword) >> 16 & 0xffff;
return sprintf("%02s",$hash % $n);
}
?>
crc32
md5后的16进制字符进行截取
hash算法一般是利用数组实现的,步骤如下:
存元素时:
1.把要存储的元素(value)计算一个hashcode(称为散列),这个就是key。
2.把元素存储到以hashcode为下标的数组中。
3.若此数组下标已经有元素,则使用链表的方式把元素连接起来。
获得元素时:
1.元素(value)计算hashcode。
2.hash表中按hashcode(key)取得元素。
3.若一个key中对应多个元素,则还需匹配是哪个元素。
就这么简单,hash算法由于直接映射数组下标,所以查找算法的时间复杂度来说是O(1)的。不过若计算hashcode的算法不是很好的话,可能造成一个桶(数组中的一个位置)内有多个元素,而有些桶内一个元素都没有。这样在存、取元素时都需要在桶内进行查找操作,而且造成空间的浪费。
所以一个好的hashcode的算法使得任意给定的元素能够均匀地存储在hash表中的每个桶内,显得尤为重要。
以下给出一个非常经典的通用散列算法,经过研究人员统计分析过散列程度的。
unsigned long hashcode(const unsigned char *name)
{
unsigned long h=0,g;
while(*name)
{
h=(h<<4) + *name++;
if(g=h & 0xF0000000)
h^=g>>24;
h &=~g;
}
return h;
}
除非你对这个通用散列算法有特殊需求,导致无法满足需要,否则应该使用这个函数。
hash算法确实应用得非常广泛,因为其查找的速度是O(1)的。比如:如今数据的海量存取和高并发访问的需求,造成关系数据库逐渐退出舞台。DB中使用B+树索引提供范围查询,hash(key-value)索引实现点查询。
但一种数据结构只能满足某几种需求,程序设计中要灵活地应用。