Skip to content

Commit 2d21d7b

Browse files
committed
Small optimizations
1 parent efe73ab commit 2d21d7b

File tree

1 file changed

+37
-42
lines changed

1 file changed

+37
-42
lines changed

murmurhash3_32_gc.php

+37-42
Original file line numberDiff line numberDiff line change
@@ -10,48 +10,43 @@
1010
* @author Austin Appleby ([email protected])
1111
* @see http://sites.google.com/site/murmurhash/
1212
*
13-
* @param string $key Text to hash.
14-
* @param number $seed Positive integer only
13+
* @param string $key Text to hash.
14+
* @param number $seed Positive integer only
1515
* @return number 32-bit (base 32 converted) positive integer hash
1616
*/
17-
18-
function murmurhash3_32_gc($key,$seed=0){
19-
$klen = strlen($key);
20-
$bytes = $klen - ($remainder = $klen & 3);
21-
$h1 = $seed;
22-
$c1 = 0xcc9e2d51;
23-
$c2 = 0x1b873593;
24-
$i = 0;
25-
while ($i < $bytes) {
26-
$k1 = ((ord($key[$i]) & 0xff)) |
27-
((ord($key[++$i]) & 0xff) << 8) |
28-
((ord($key[++$i]) & 0xff) << 16) |
29-
((ord($key[++$i]) & 0xff) << 24);
30-
++$i;
31-
$k1 = (((($k1 & 0xffff) * $c1) + (((($k1 >> 16) * $c1) & 0xffff) << 16))) & 0xffffffff;
32-
$k1 = $k1 << 15 | $k1 >> 17;
33-
$k1 = (((($k1 & 0xffff) * $c2) + (((($k1 >> 16) * $c2) & 0xffff) << 16))) & 0xffffffff;
34-
$h1 ^= $k1;
35-
$h1 = $h1 << 13 | $h1 >> 19;
36-
$h1b = (((($h1 & 0xffff) * 5) + (((($h1 >> 16) * 5) & 0xffff) << 16))) & 0xffffffff;
37-
$h1 = ((($h1b & 0xffff) + 0x6b64) + (((($h1b >> 16) + 0xe654) & 0xffff) << 16));
38-
}
39-
40-
$k1 = 0;
41-
switch ($remainder) {
42-
case 3: $k1 ^= (ord($key[$i + 2]) & 0xff) << 16;
43-
case 2: $k1 ^= (ord($key[$i + 1]) & 0xff) << 8;
44-
case 1: $k1 ^= (ord($key[$i]) & 0xff);
45-
$k1 = ((($k1 & 0xffff) * $c1) + (((($k1 >> 16) * $c1) & 0xffff) << 16)) & 0xffffffff;
46-
$k1 = $k1 << 15 | $k1 >> 17;
47-
$k1 = ((($k1 & 0xffff) * $c2) + (((($k1 >> 16) * $c2) & 0xffff) << 16)) & 0xffffffff;
48-
$h1 ^= $k1;
49-
}
50-
$h1 ^= $klen;
51-
$h1 ^= $h1 >> 16;
52-
$h1 = ((($h1 & 0xffff) * 0x85ebca6b) + (((($h1 >> 16) * 0x85ebca6b) & 0xffff) << 16)) & 0xffffffff;
53-
$h1 ^= $h1 >> 13;
54-
$h1 = (((($h1 & 0xffff) * 0xc2b2ae35) + (((($h1 >> 16) * 0xc2b2ae35) & 0xffff) << 16))) & 0xffffffff;
55-
$h1 ^= $h1 >> 16;
56-
return base_convert($h1,10,32);
17+
18+
function murmurhash3_32_opt($key,$seed=0){
19+
$klen = strlen($key);
20+
$h1 = $seed;
21+
for ($i=0,$bytes=$klen-($remainder=$klen&3) ; $i<$bytes ; ) {
22+
$k1 = ((ord($key[$i]) & 0xff))
23+
| ((ord($key[++$i]) & 0xff) << 8)
24+
| ((ord($key[++$i]) & 0xff) << 16)
25+
| ((ord($key[++$i]) & 0xff) << 24);
26+
++$i;
27+
$k1 = (((($k1 & 0xffff) * 0xcc9e2d51) + (((($k1 >> 16) * 0xcc9e2d51) & 0xffff) << 16))) & 0xffffffff;
28+
$k1 = $k1 << 15 | $k1 >> 17;
29+
$k1 = (((($k1 & 0xffff) * 0x1b873593) + (((($k1 >> 16) * 0x1b873593) & 0xffff) << 16))) & 0xffffffff;
30+
$h1 ^= $k1;
31+
$h1 = $h1 << 13 | $h1 >> 19;
32+
$h1b = (((($h1 & 0xffff) * 5) + (((($h1 >> 16) * 5) & 0xffff) << 16))) & 0xffffffff;
33+
$h1 = ((($h1b & 0xffff) + 0x6b64) + (((($h1b >> 16) + 0xe654) & 0xffff) << 16));
34+
}
35+
$k1 = 0;
36+
switch ($remainder) {
37+
case 3: $k1 ^= (ord($key[$i + 2]) & 0xff) << 16;
38+
case 2: $k1 ^= (ord($key[$i + 1]) & 0xff) << 8;
39+
case 1: $k1 ^= (ord($key[$i]) & 0xff);
40+
$k1 = ((($k1 & 0xffff) * 0xcc9e2d51) + (((($k1 >> 16) * 0xcc9e2d51) & 0xffff) << 16)) & 0xffffffff;
41+
$k1 = $k1 << 15 | $k1 >> 17;
42+
$k1 = ((($k1 & 0xffff) * 0x1b873593) + (((($k1 >> 16) * 0x1b873593) & 0xffff) << 16)) & 0xffffffff;
43+
$h1 ^= $k1;
44+
}
45+
$h1 ^= $klen;
46+
$h1 ^= $h1 >> 16;
47+
$h1 = ((($h1 & 0xffff) * 0x85ebca6b) + (((($h1 >> 16) * 0x85ebca6b) & 0xffff) << 16)) & 0xffffffff;
48+
$h1 ^= $h1 >> 13;
49+
$h1 = (((($h1 & 0xffff) * 0xc2b2ae35) + (((($h1 >> 16) * 0xc2b2ae35) & 0xffff) << 16))) & 0xffffffff;
50+
$h1 ^= $h1 >> 16;
51+
return base_convert($h1,10,32);
5752
}

0 commit comments

Comments
 (0)