Notice: Function _load_textdomain_just_in_time was called incorrectly. Translation loading for the copy-the-code domain was triggered too early. This is usually an indicator for some code in the plugin or theme running too early. Translations should be loaded at the init action or later. Please see Debugging in WordPress for more information. (This message was added in version 6.7.0.) in /var/www/html/pcx3.com/wp-includes/functions.php on line 6121

Notice: Function _load_textdomain_just_in_time was called incorrectly. Translation loading for the pb-seo-friendly-images domain was triggered too early. This is usually an indicator for some code in the plugin or theme running too early. Translations should be loaded at the init action or later. Please see Debugging in WordPress for more information. (This message was added in version 6.7.0.) in /var/www/html/pcx3.com/wp-includes/functions.php on line 6121

Notice: Function _load_textdomain_just_in_time was called incorrectly. Translation loading for the johannes domain was triggered too early. This is usually an indicator for some code in the plugin or theme running too early. Translations should be loaded at the init action or later. Please see Debugging in WordPress for more information. (This message was added in version 6.7.0.) in /var/www/html/pcx3.com/wp-includes/functions.php on line 6121
Murmurhash2 in PHP without the extension - PC✗3
Murmurhash2 in PHP without the extension

Murmurhash2 in PHP without the extension

Murmurhash is a nice and speedy hashing algorithm that is handy for creating hash values based on strings. I use it often as benchmarks suggest it is one of the speedier implementations out there. Murmurhash can create 32-bit or 128-bit outputs.

In PHP, if you are able to install extensions, then you can simply install the murmurhash extension * (see bottom of page for instructions) and be done with it. If you’re on shared hosting, here is an extensionless alternative to produce 32-bit outputs based on the 2nd version of the murmurhash algorithm.

Do note, it is many times slower than the extension implementation, simply because it’s a user-created function. The code itself is relatively efficient and mostly bitshifting anyway. I had to knock this together because I needed murmurhash in a shared hosting environment where installing extensions is not an option.

if(!function_exists('murmurhash')) {
	function murmurhash($key,$seed = 0) {
		$m = 0x5bd1e995;
		$r = 24;
		$len = strlen($key);
		$h = $seed ^ $len;
		$o = 0;
		
		while($len >= 4) {
			$k = ord($key[$o]) | (ord($key[$o+1]) << 8) | (ord($key[$o+2]) << 16) | (ord($key[$o+3]) << 24);
			$k = ($k * $m) & 4294967295;
			$k = ($k ^ ($k >> $r)) & 4294967295;
			$k = ($k * $m) & 4294967295;

			$h = ($h * $m) & 4294967295;
			$h = ($h ^ $k) & 4294967295;

			$o += 4;
			$len -= 4;
		}

		$data = substr($key,0 - $len,$len);
	
		switch($len) {
			case 3: $h = ($h ^ (ord($data[2]) << 16)) & 4294967295;
			case 2: $h = ($h ^ (ord($data[1]) << 8)) & 4294967295;
			case 1: $h = ($h ^ (ord($data[0]))) & 4294967295;
			$h = ($h * $m) & 4294967295;
		};
		$h = ($h ^ ($h >> 13)) & 4294967295;
		$h = ($h * $m) & 4294967295;
		$h = ($h ^ ($h >> 15)) & 4294967295;
	
	 return $h;
	}
}


$string = 'mytest'
echo murmurhash($string),"\n";
// outputs 2029812915

* More recently that particular link for instructions on how to install the murmurhash extension is no available. Here is the general gist of how to install the extension:

# download and unzip
cd /tmp
curl -o murmurhash.zip "https://codeload.github.com/zircote/php_murmurhash/zip/master"
unzip murmurhash.zip
cd php_murmurhash-master
# configure and make
phpize
./configure
make
make install
# Add extension to your .ini files
echo "extension=murmurhash.so" >> /etc/php5/apache2/php.ini
echo "extension=murmurhash.so" >> /etc/php5/cli/php.ini
whoami
Stefan Pejcic
Join the discussion

I enjoy constructive responses and professional comments to my posts, and invite anyone to comment or link to my site.