数码资讯
PHP散列算法介绍
哈希表是PHP的核心,这不是太多。 PHP数组,该数组、对象的属性、函数表,符号表,等等都是用哈希表的容器。 PHP的Hashtable拉链法解决冲突。因为我不需要谈论它,我今天主要关注的是PHP的散列算法和算法本身揭示的一些想法。 PHP哈希是最常见的djbx33a(丹尼尔J.伯恩斯坦时代之外,3
选购提示
关注价格、性能、续航、售后和真实使用场景,理性比较后再下单。
哈希表是PHP的核心,这不是太多。
PHP数组,该数组、对象的属性、函数表,符号表,等等都是用哈希表的容器。
PHP的Hashtable拉链法解决冲突。因为我不需要谈论它,我今天主要关注的是PHP的散列算法和算法本身揭示的一些想法。
PHP哈希是最常见的djbx33a(丹尼尔J.伯恩斯坦时代之外,33),该算法广泛应用于Apache和一些软件项目,Perl和伯克利DB。这是最著名的hash算法,因为算法很快很好,但分类(冲突,均匀分布)。
该算法的核心思想是:
复制代码代码如下所示:
哈希(我)=哈希(i-1)* 33 + str {我}
在zend_hash。H,我们可以在PHP中发现算法:
复制代码代码如下所示:
静态内联页zend_inline_hash_func(char *都可以实现,单元nkeylength)
{
登记页hash = 5381;
变异与哈希展开八 / * * /次
对于(nkeylength;nkeylength = { > = 8;
哈希值=((哈希<< 5)+散列)* + +都可以实现;
哈希值=((哈希<< 5)+散列)* + +都可以实现;
哈希值=((哈希<< 5)+散列)* + +都可以实现;
哈希值=((哈希<< 5)+散列)* + +都可以实现;
哈希值=((哈希<< 5)+散列)* + +都可以实现;
哈希值=((哈希<< 5)+散列)* + +都可以实现;
哈希值=((哈希<< 5)+散列)* + +都可以实现;
哈希值=((哈希<< 5)+散列)* + +都可以实现;
}
开关(nkeylength){
案例7:(hash =(哈希<5)+哈希*都可以实现+ +); / * * / fallthrough…
案例6:(hash =(哈希<5)+哈希*都可以实现+ +); / * * / fallthrough…
案例5:(hash =(哈希<5)+哈希*都可以实现+ +); / * * / fallthrough…
案例4:(hash =(哈希<5)+哈希*都可以实现+ +); / * * / fallthrough…
案例3:(hash =(哈希<5)+哈希*都可以实现+ +); / * * / fallthrough…
案例2:(hash =(哈希<5)+哈希*都可以实现+ +); / * * / fallthrough…
案例1:哈希=((哈希<< 5)+散列)+ * +休息都可以实现;
案例0:突破;
empty_switch_default_case()
}
返回哈希;
}
在Apache和Perl中直接使用的经典时间33算法是:
复制代码代码如下所示:
perl 5.005中使用的散列函数:
返回字符串的哈希值#:hash = perlhash美元(关键)
#(由高压。H的perl_hash宏定义)
perlhash子
{
$哈希=0;
foreach(分/班){
哈希散列美元=美元* 33 +或($ _);
}
返回$哈希;
}
在PHP的散列算法中,我们可以看到它是非常不同的。
首先,最不同的是PHP不直接使用33,而是使用:
复制代码代码如下所示:
散列< 5 +哈希
这肯定比使用它快。
然后,特别是我们的想法是使用打开缓存前几天我读了一篇文章关于Discuz,据说这是一个很会根据岗位热采取不同的缓存策略,根据用户的使用习惯,但只有第一页缓存的帖子(因为很少有人会后)。
以类似的方式,PHP鼓励8位字符索引。他用打开提高8个单位的效率,这是一个非常详细和具体的地方。
还有内联的寄存器变量……可以看出PHP开发人员在优化散列方面也很辛苦。
最后,散列的初始值设置为5381。与Apache中的时间算法和Perl中的散列算法(所有初始散列为0)相比,我为什么选择5381我不知道具体原因,但我发现了5381的一些特点。
复制代码代码如下所示:
魔法常数5381:
1。奇数
2。质数
三.亏数
考虑到这一点,我有理由相信,选择初始值可以提供更好的分类。
PHP数组,该数组、对象的属性、函数表,符号表,等等都是用哈希表的容器。
PHP的Hashtable拉链法解决冲突。因为我不需要谈论它,我今天主要关注的是PHP的散列算法和算法本身揭示的一些想法。
PHP哈希是最常见的djbx33a(丹尼尔J.伯恩斯坦时代之外,33),该算法广泛应用于Apache和一些软件项目,Perl和伯克利DB。这是最著名的hash算法,因为算法很快很好,但分类(冲突,均匀分布)。
该算法的核心思想是:
复制代码代码如下所示:
哈希(我)=哈希(i-1)* 33 + str {我}
在zend_hash。H,我们可以在PHP中发现算法:
复制代码代码如下所示:
静态内联页zend_inline_hash_func(char *都可以实现,单元nkeylength)
{
登记页hash = 5381;
变异与哈希展开八 / * * /次
对于(nkeylength;nkeylength = { > = 8;
哈希值=((哈希<< 5)+散列)* + +都可以实现;
哈希值=((哈希<< 5)+散列)* + +都可以实现;
哈希值=((哈希<< 5)+散列)* + +都可以实现;
哈希值=((哈希<< 5)+散列)* + +都可以实现;
哈希值=((哈希<< 5)+散列)* + +都可以实现;
哈希值=((哈希<< 5)+散列)* + +都可以实现;
哈希值=((哈希<< 5)+散列)* + +都可以实现;
哈希值=((哈希<< 5)+散列)* + +都可以实现;
}
开关(nkeylength){
案例7:(hash =(哈希<5)+哈希*都可以实现+ +); / * * / fallthrough…
案例6:(hash =(哈希<5)+哈希*都可以实现+ +); / * * / fallthrough…
案例5:(hash =(哈希<5)+哈希*都可以实现+ +); / * * / fallthrough…
案例4:(hash =(哈希<5)+哈希*都可以实现+ +); / * * / fallthrough…
案例3:(hash =(哈希<5)+哈希*都可以实现+ +); / * * / fallthrough…
案例2:(hash =(哈希<5)+哈希*都可以实现+ +); / * * / fallthrough…
案例1:哈希=((哈希<< 5)+散列)+ * +休息都可以实现;
案例0:突破;
empty_switch_default_case()
}
返回哈希;
}
在Apache和Perl中直接使用的经典时间33算法是:
复制代码代码如下所示:
perl 5.005中使用的散列函数:
返回字符串的哈希值#:hash = perlhash美元(关键)
#(由高压。H的perl_hash宏定义)
perlhash子
{
$哈希=0;
foreach(分/班){
哈希散列美元=美元* 33 +或($ _);
}
返回$哈希;
}
在PHP的散列算法中,我们可以看到它是非常不同的。
首先,最不同的是PHP不直接使用33,而是使用:
复制代码代码如下所示:
散列< 5 +哈希
这肯定比使用它快。
然后,特别是我们的想法是使用打开缓存前几天我读了一篇文章关于Discuz,据说这是一个很会根据岗位热采取不同的缓存策略,根据用户的使用习惯,但只有第一页缓存的帖子(因为很少有人会后)。
以类似的方式,PHP鼓励8位字符索引。他用打开提高8个单位的效率,这是一个非常详细和具体的地方。
还有内联的寄存器变量……可以看出PHP开发人员在优化散列方面也很辛苦。
最后,散列的初始值设置为5381。与Apache中的时间算法和Perl中的散列算法(所有初始散列为0)相比,我为什么选择5381我不知道具体原因,但我发现了5381的一些特点。
复制代码代码如下所示:
魔法常数5381:
1。奇数
2。质数
三.亏数
考虑到这一点,我有理由相信,选择初始值可以提供更好的分类。
声明:本文内容用于数码产品信息整理与选购参考,具体价格、库存、售后政策以官方渠道和电商页面实时信息为准。