达夫设备

PHP中HASH函数的优化技巧

笑着哭i 提交于 2019-12-07 04:26:26
Hash数据结构是一种非常常见的数据结构,作为一个程序员,你可能每天都在和它接触, 尽管很多时候你可能没有意识到。Hash在PHP内核中扮演了非常重要的角色,数组、变量作用域、函数参数列表等均是基于Hash实现。所以,在PHP里你能看到各种对于Hash的优化。 Hash数据结构 Hash数据结构,本质上为了解决计算机中真正意义的数组只能使用数字作为索引,而程序员却经常需要使用字符串或者其他更复杂的类型来作为数组key的问题。首先我们需要一个函数能把字符串转成数字。然后,由于数组的长度有限,我们还需要把这个数字映射到数组长度的区间里,一般使用取模操作。最后, 如果两个字符串最终计算出来的Hash值一样,将保存到数组相同的位置上,这种情况叫做Hash冲突。解决冲突的常见办法之一就是拉链法, 就是将Hash冲突的数据维护在一个链表里; 另一种比较常见的解决冲突的办法叫开放寻址。下图所示是一个典型的Hash结构: Hash函数的最优情况是,将key平均分布在数组空间中, 这样能获得最大的性能。最坏的情况是完全冲突,这个时候Hash表事实上已经退化为一个链表。前几年比较火的Hash攻击事实上就是构造大量的冲突key,使PHP的POST数组退化为链表,从而耗尽服务器的CPU资源。 因此我们可以得出一个结论, 一个优秀的hash函数应该符合两点: 足够随机分布,足够快 。 DJB2算法