|
10 | 10 | * @author Austin Appleby ([email protected])
|
11 | 11 | * @see http://sites.google.com/site/murmurhash/
|
12 | 12 | *
|
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 |
15 | 15 | * @return number 32-bit (base 32 converted) positive integer hash
|
16 | 16 | */
|
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); |
57 | 52 | }
|
0 commit comments