标题:sdbm hash for PHP 出处:Felix021 时间:Sat, 21 Aug 2010 01:59:06 +0000 作者:felix021 地址:https://www.felix021.com/blog/read.php?1915 内容: 上一篇提到了,使用sdbmhash来生成64bit摘要。这个算法,是需要用在PHP里头的,但是PHP在设计的时候有点囧,用于表示任意变量的 zval 这个struct里头,有一个union是用于存放不同数据类型的,而该union中用于表示整型的变量,就只有一个long。于是很杯具地: 1. 32bit OS下面的php只支持32bit整数 2. 不支持无符号整型 那个抑郁啊,于是只好用php的bcmath这个大整数库来实现上一篇的sdbmhash算法:function sdbmhash($str) { $mul = "65599"; // (1 << 6) + (1 << 16) - 1 $mod = "18446744073709551616"; // 1 << 64 $hash = "0"; for ($i = 0; $i < strlen($str); ++$i) { $hash = bcmod(bcmul($hash, $mul), $mod); $hash = bcmod(bcadd($hash, ord($str{$i})), $mod); } return $hash; } 大整数库是用字符串来模拟的,没有对位移的直接支持。于是刚开始的时候用 bcmul($hash, 1 Generated by Bo-blog 2.1.0