Sha256: adee3aa9817f38f6e4ec6b8b8479f82969f809033236b4a87f6591ca7730b301

Contents?: true

Size: 1.83 KB

Versions: 2

Compression:

Stored size: 1.83 KB

Contents

/*
 * MurmurHash1 (C) Austin Appleby
 */

#include "murmurhash1.h"

static inline size_t
murmur1(uint32_t h, const uint8_t r)
{
	const uint32_t m = MURMURHASH_MAGIC;
	h *= m;
	h ^= h >> r;
	return h;
}

static uint32_t
murmur_hash_process1(const char *data, uint32_t length)
{
	const uint32_t m = MURMURHASH_MAGIC;
	const uint8_t r = 16;
	uint32_t h;

	h = length * m;

	while (4 <= length) {
		h += *(uint32_t*)data;
		h = murmur1(h, r);
		data += 4;
		length -= 4;
	}

	switch (length) {
	case 3:
		h += data[2] << 16;
	case 2:
		h += data[1] << 8;
	case 1:
		h += data[0];
		h = murmur1(h, r);
	}

	h = murmur1(h, 10);
	h = murmur1(h, 17);

	return h;
}

VALUE
murmur1_finish(VALUE self)
{
	uint32_t h;
	uint8_t digest[4];
	MURMURHASH(self, ptr);

	h = murmur_hash_process1(ptr->buffer, ptr->p - ptr->buffer);

	digest[0] = h >> 24;
	digest[1] = h >> 16;
	digest[2] = h >> 8;
	digest[3] = h;

	return rb_str_new((const char*) digest, 4);
}

VALUE
murmur1_to_i(VALUE self)
{
	MURMURHASH(self, ptr);
	return UINT2NUM(murmur_hash_process1(ptr->buffer, ptr->p - ptr->buffer));
}

VALUE
murmur1_s_digest(int argc, VALUE *argv, VALUE klass)
{
	VALUE str;
	uint32_t h;
	uint8_t digest[4];

	if (argc < 1)
		rb_raise(rb_eArgError, "no data given");

	str = *argv++;
	argc--;

	StringValue(str);

	h = murmur_hash_process1(RSTRING_PTR(str), RSTRING_LEN(str));

	digest[0] = h >> 24;
	digest[1] = h >> 16;
	digest[2] = h >> 8;
	digest[3] = h;

	return rb_str_new((const char*) digest, 4);
}

VALUE
murmur1_s_hexdigest(int argc, VALUE *argv, VALUE klass)
{
	return hexencode_str_new(murmur1_s_digest(argc, argv, klass));
}

VALUE
murmur1_s_rawdigest(int argc, VALUE *argv, VALUE klass)
{
	VALUE str;

	if (argc < 1)
		rb_raise(rb_eArgError, "no data given");

	str = *argv++;
	argc--;

	StringValue(str);

	return UINT2NUM(murmur_hash_process1(RSTRING_PTR(str), RSTRING_LEN(str)));
}

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
digest-murmurhash-0.2.3 ext/digest/murmurhash/murmurhash1.c
digest-murmurhash-0.2.2 ext/digest/murmurhash/murmurhash1.c