Sha256: 9d9ec760d6958e05470c0da1526a58fcfbca345895b8696be1f7eaadc1bb949a

Contents?: true

Size: 1.54 KB

Versions: 1

Compression:

Stored size: 1.54 KB

Contents

/*
 * MurmurHashNeutral2 (C) Austin Appleby
 */

#include "murmurhash_neutral2.h"

uint32_t
murmur_hash_process_neutral2(const char * key, uint32_t len, uint32_t seed)
{
	const uint32_t m = 0x5bd1e995;
	const int r = 24;

	uint32_t h = seed ^ len;

	const unsigned char * data = (const unsigned char *)key;

	while(len >= 4) {
		uint32_t k;

		k  = data[0];
		k |= data[1] << 8;
		k |= data[2] << 16;
		k |= data[3] << 24;

		k *= m; 
		k ^= k >> r; 
		k *= m;

		h *= m;
		h ^= k;

		data += 4;
		len -= 4;
	}

	switch(len) {
	case 3: h ^= data[2] << 16;
	case 2: h ^= data[1] << 8;
	case 1: h ^= data[0];
			h *= m;
	};

	h ^= h >> 13;
	h *= m;
	h ^= h >> 15;

	return h;
}

VALUE
murmur_neutral2_finish(VALUE self)
{
	uint8_t digest[4];
	uint32_t h;

	h = _murmur_finish32(self, murmur_hash_process_neutral2);
	ASSINE_BY_ENDIAN_32(digest, h);
	return rb_str_new((const char*) digest, 4);
}

VALUE
murmur_neutral2_to_i(VALUE self)
{
	return ULL2NUM(_murmur_finish32(self, murmur_hash_process_neutral2));
}

VALUE
murmur_neutral2_s_digest(int argc, VALUE *argv, VALUE klass)
{
	uint8_t digest[4];
	uint64_t h;
	h = _murmur_s_digest32(argc, argv, klass, murmur_hash_process_neutral2);
	ASSINE_BY_ENDIAN_32(digest, h);
	return rb_str_new((const char*) digest, 4);
}

VALUE
murmur_neutral2_s_hexdigest(int argc, VALUE *argv, VALUE klass)
{
	return hexencode_str_new(murmur_neutral2_s_digest(argc, argv, klass));
}

VALUE
murmur_neutral2_s_rawdigest(int argc, VALUE *argv, VALUE klass)
{
	return ULL2NUM(_murmur_s_digest32(argc, argv, klass, murmur_hash_process_neutral2));
}

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
digest-murmurhash-0.3.0 ext/digest/murmurhash/murmurhash_neutral2.c