ext/digest/murmurhash/murmurhash.c in digest-murmurhash-0.3.0 vs ext/digest/murmurhash/murmurhash.c in digest-murmurhash-1.0.0

- old
+ new

@@ -6,248 +6,167 @@ #include "murmurhash64b.h" #include "murmurhash_neutral2.h" #include "murmurhash_aligned2.h" VALUE cDigest_MurmurHash1, - cDigest_MurmurHash2, - cDigest_MurmurHash2A, - cDigest_MurmurHash64A, - cDigest_MurmurHash64B, - cDigest_MurmurHashNeutral2, - cDigest_MurmurHashAligned2; -ID id_seed, - id_DEFAULT_SEED; + cDigest_MurmurHash2, + cDigest_MurmurHash2A, + cDigest_MurmurHash64A, + cDigest_MurmurHash64B, + cDigest_MurmurHashNeutral2, + cDigest_MurmurHashAligned2; +ID id_DEFAULT_SEED; +ID iv_seed; +ID iv_buffer; -VALUE -murmur_seed_get32(VALUE self) +void +assign_by_endian_32(uint8_t *digest, uint64_t h) { - if (!rb_ivar_defined(self, id_seed)) { - rb_ivar_set(self, id_seed, rb_usascii_str_new(DEFAULT_SEED, 4)); - } - return rb_ivar_get(self, id_seed); + if (BIGENDIAN_P()) { + digest[0] = h >> 24; + digest[1] = h >> 16; + digest[2] = h >> 8; + digest[3] = h; + } + else { + digest[3] = h >> 24; + digest[2] = h >> 16; + digest[1] = h >> 8; + digest[0] = h; + } } -VALUE -murmur_seed_set32(VALUE self, VALUE obj) +void +assign_by_endian_64(uint8_t *digest, uint64_t h) { - StringValue(obj); - if (RSTRING_LEN(obj) != 4) { - rb_raise(rb_eArgError, "seed string should 64 bit chars"); - } - return rb_ivar_set(self, id_seed, obj); + if (BIGENDIAN_P()) { + digest[0] = h >> 56; + digest[1] = h >> 48; + digest[2] = h >> 40; + digest[3] = h >> 32; + digest[4] = h >> 24; + digest[5] = h >> 16; + digest[6] = h >> 8; + digest[7] = h; + } + else { + digest[7] = h >> 56; + digest[6] = h >> 48; + digest[5] = h >> 40; + digest[4] = h >> 32; + digest[3] = h >> 24; + digest[2] = h >> 16; + digest[1] = h >> 8; + digest[0] = h; + } } -VALUE -murmur_seed_get64(VALUE self) -{ - if (!rb_ivar_defined(self, id_seed)) { - rb_ivar_set(self, id_seed, rb_usascii_str_new(DEFAULT_SEED, 8)); - } - return rb_ivar_get(self, id_seed); -} - -VALUE -murmur_seed_set64(VALUE self, VALUE obj) -{ - StringValue(obj); - if (RSTRING_LEN(obj) != 8) { - rb_raise(rb_eArgError, "seed string should 64 bit chars"); - } - return rb_ivar_set(self, id_seed, obj); -} - uint32_t _murmur_finish32(VALUE self, uint32_t (*process)(const char *, uint32_t, uint32_t)) { - const char *seed = RSTRING_PTR(murmur_seed_get32(self)); - MURMURHASH(self, ptr); - return process(ptr->buffer, ptr->p - ptr->buffer, *(uint32_t*)seed); + const char *seed = RSTRING_PTR(rb_ivar_get(self, iv_seed)); + VALUE buffer = rb_ivar_get(self, iv_buffer); + return process(RSTRING_PTR(buffer), RSTRING_LEN(buffer), *(uint32_t*)seed); } uint64_t _murmur_finish64(VALUE self, uint64_t (*process)(const char *, uint32_t, uint64_t)) { - const char *seed = RSTRING_PTR(murmur_seed_get64(self)); - MURMURHASH(self, ptr); - return process(ptr->buffer, ptr->p - ptr->buffer, *(uint64_t*)seed); + const char *seed = RSTRING_PTR(rb_ivar_get(self, iv_seed)); + VALUE buffer = rb_ivar_get(self, iv_buffer); + return process(RSTRING_PTR(buffer), RSTRING_LEN(buffer), *(uint64_t*)seed); } - uint32_t _murmur_s_digest32(int argc, VALUE *argv, VALUE klass, uint32_t (*process)(const char *, uint32_t, uint32_t)) { - VALUE str; - const char *seed; + VALUE str; + const char *seed; - if (argc < 1) - rb_raise(rb_eArgError, "no data given"); + if (argc < 1) + rb_raise(rb_eArgError, "no data given"); - str = *argv; + str = *argv; - StringValue(str); + StringValue(str); - if (1 < argc) { - StringValue(argv[1]); - if (RSTRING_LEN(argv[1]) != 4) { - rb_raise(rb_eArgError, "seed string should 32 bit chars"); - } - seed = RSTRING_PTR(argv[1]); - } else { - seed = RSTRING_PTR(rb_const_get(klass, id_DEFAULT_SEED)); - } + if (1 < argc) { + StringValue(argv[1]); + if (RSTRING_LEN(argv[1]) != 4) { + rb_raise(rb_eArgError, "seed string should 32 bit chars"); + } + seed = RSTRING_PTR(argv[1]); + } else { + seed = RSTRING_PTR(rb_const_get(klass, id_DEFAULT_SEED)); + } - return process(RSTRING_PTR(str), RSTRING_LEN(str), *(uint32_t*)seed); + return process(RSTRING_PTR(str), RSTRING_LEN(str), *(uint32_t*)seed); } uint64_t _murmur_s_digest64(int argc, VALUE *argv, VALUE klass, uint64_t (*process)(const char *, uint32_t, uint64_t)) { - VALUE str; - const char *seed; + VALUE str; + const char *seed; - if (argc < 1) - rb_raise(rb_eArgError, "no data given"); + if (argc < 1) + rb_raise(rb_eArgError, "no data given"); - str = *argv; + str = *argv; - StringValue(str); + StringValue(str); - if (1 < argc) { - StringValue(argv[1]); - if (RSTRING_LEN(argv[1]) != 8) { - rb_raise(rb_eArgError, "seed string should 64 bit chars"); - } - seed = RSTRING_PTR(argv[1]); - } else { - seed = RSTRING_PTR(rb_const_get(klass, id_DEFAULT_SEED)); - } + if (1 < argc) { + StringValue(argv[1]); + if (RSTRING_LEN(argv[1]) != 8) { + rb_raise(rb_eArgError, "seed string should 64 bit chars"); + } + seed = RSTRING_PTR(argv[1]); + } else { + seed = RSTRING_PTR(rb_const_get(klass, id_DEFAULT_SEED)); + } - return process(RSTRING_PTR(str), RSTRING_LEN(str), *(uint64_t*)seed); + return process(RSTRING_PTR(str), RSTRING_LEN(str), *(uint64_t*)seed); } -/* - * from https://github.com/ruby/ruby/blob/trunk/ext/digest/digest.c - * Copyright (C) 1995-2001 Yukihiro Matsumoto - * Copyright (C) 2001-2006 Akinori MUSHA - */ -VALUE -hexencode_str_new(VALUE str_digest) -{ - char *digest; - size_t digest_len; - size_t i; - VALUE str; - char *p; - static const char hex[] = { - '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', - 'a', 'b', 'c', 'd', 'e', 'f' - }; - - StringValue(str_digest); - digest = RSTRING_PTR(str_digest); - digest_len = RSTRING_LEN(str_digest); - - if (LONG_MAX / 2 < digest_len) { - rb_raise(rb_eRuntimeError, "digest string too long"); - } - - str = rb_usascii_str_new(0, digest_len * 2); - - for (i = 0, p = RSTRING_PTR(str); i < digest_len; i++) { - unsigned char byte = digest[i]; - - p[i + i] = hex[byte >> 4]; - p[i + i + 1] = hex[byte & 0x0f]; - } - - return str; -} - void Init_murmurhash(void) { - VALUE mDigest, cDigest_StringBuffer; + id_DEFAULT_SEED = rb_intern("DEFAULT_SEED"); + iv_seed = rb_intern("@seed"); + iv_buffer = rb_intern("@buffer"); - id_seed = rb_intern("seed"); - id_DEFAULT_SEED = rb_intern("DEFAULT_SEED"); + cDigest_MurmurHash1 = rb_path2class("Digest::MurmurHash1"); + rb_define_singleton_method(cDigest_MurmurHash1, "digest", murmur1_s_digest, -1); + rb_define_singleton_method(cDigest_MurmurHash1, "rawdigest", murmur1_s_rawdigest, -1); + rb_define_private_method(cDigest_MurmurHash1, "finish", murmur1_finish, 0); - /* Digest::MurmurHash is require that Digest::StringBuffer */ - mDigest = rb_path2class("Digest"); - cDigest_StringBuffer = rb_path2class("Digest::StringBuffer"); + cDigest_MurmurHash2 = rb_path2class("Digest::MurmurHash2"); + rb_define_singleton_method(cDigest_MurmurHash2, "digest", murmur2_s_digest, -1); + rb_define_singleton_method(cDigest_MurmurHash2, "rawdigest", murmur2_s_rawdigest, -1); + rb_define_private_method(cDigest_MurmurHash2, "finish", murmur2_finish, 0); - /* class Digest::MurmurHash1 < Digest::StringBuffer */ - cDigest_MurmurHash1 = rb_define_class_under(mDigest, "MurmurHash1", cDigest_StringBuffer); - rb_define_const(cDigest_MurmurHash1, "DEFAULT_SEED", rb_usascii_str_new(DEFAULT_SEED, 4)); - rb_define_singleton_method(cDigest_MurmurHash1, "digest", murmur1_s_digest, -1); - rb_define_singleton_method(cDigest_MurmurHash1, "hexdigest", murmur1_s_hexdigest, -1); - rb_define_singleton_method(cDigest_MurmurHash1, "rawdigest", murmur1_s_rawdigest, -1); - rb_define_private_method(cDigest_MurmurHash1, "finish", murmur1_finish, 0); - rb_define_method(cDigest_MurmurHash1, "to_i", murmur1_to_i, 0); - rb_define_method(cDigest_MurmurHash1, "seed", murmur_seed_get32, 0); - rb_define_method(cDigest_MurmurHash1, "seed=", murmur_seed_set32, 1); + cDigest_MurmurHash2A = rb_path2class("Digest::MurmurHash2A"); + rb_define_singleton_method(cDigest_MurmurHash2A, "digest", murmur2a_s_digest, -1); + rb_define_singleton_method(cDigest_MurmurHash2A, "rawdigest", murmur2a_s_rawdigest, -1); + rb_define_private_method(cDigest_MurmurHash2A, "finish", murmur2a_finish, 0); - /* class Digest::MurmurHash2 < Digest::StringBuffer */ - cDigest_MurmurHash2 = rb_define_class_under(mDigest, "MurmurHash2", cDigest_StringBuffer); - rb_define_const(cDigest_MurmurHash2, "DEFAULT_SEED", rb_usascii_str_new(DEFAULT_SEED, 4)); - rb_define_singleton_method(cDigest_MurmurHash2, "digest", murmur2_s_digest, -1); - rb_define_singleton_method(cDigest_MurmurHash2, "hexdigest", murmur2_s_hexdigest, -1); - rb_define_singleton_method(cDigest_MurmurHash2, "rawdigest", murmur2_s_rawdigest, -1); - rb_define_private_method(cDigest_MurmurHash2, "finish", murmur2_finish, 0); - rb_define_method(cDigest_MurmurHash2, "to_i", murmur2_to_i, 0); - rb_define_method(cDigest_MurmurHash2, "seed", murmur_seed_get32, 0); - rb_define_method(cDigest_MurmurHash2, "seed=", murmur_seed_set32, 1); + cDigest_MurmurHash64A = rb_path2class("Digest::MurmurHash64A"); + rb_define_singleton_method(cDigest_MurmurHash64A, "digest", murmur64a_s_digest, -1); + rb_define_singleton_method(cDigest_MurmurHash64A, "rawdigest", murmur64a_s_rawdigest, -1); + rb_define_private_method(cDigest_MurmurHash64A, "finish", murmur64a_finish, 0); - /* class Digest::MurmurHash2A < Digest::StringBuffer */ - cDigest_MurmurHash2A = rb_define_class_under(mDigest, "MurmurHash2A", cDigest_StringBuffer); - rb_define_const(cDigest_MurmurHash2A, "DEFAULT_SEED", rb_usascii_str_new(DEFAULT_SEED, 4)); - rb_define_singleton_method(cDigest_MurmurHash2A, "digest", murmur2a_s_digest, -1); - rb_define_singleton_method(cDigest_MurmurHash2A, "hexdigest", murmur2a_s_hexdigest, -1); - rb_define_singleton_method(cDigest_MurmurHash2A, "rawdigest", murmur2a_s_rawdigest, -1); - rb_define_private_method(cDigest_MurmurHash2A, "finish", murmur2a_finish, 0); - rb_define_method(cDigest_MurmurHash2A, "to_i", murmur2a_to_i, 0); - rb_define_method(cDigest_MurmurHash2A, "seed", murmur_seed_get32, 0); - rb_define_method(cDigest_MurmurHash2A, "seed=", murmur_seed_set32, 1); + cDigest_MurmurHash64B = rb_path2class("Digest::MurmurHash64B"); + rb_define_singleton_method(cDigest_MurmurHash64B, "digest", murmur64b_s_digest, -1); + rb_define_singleton_method(cDigest_MurmurHash64B, "rawdigest", murmur64b_s_rawdigest, -1); + rb_define_private_method(cDigest_MurmurHash64B, "finish", murmur64b_finish, 0); - /* class Digest::MurmurHash64A < Digest::StringBuffer */ - cDigest_MurmurHash64A = rb_define_class_under(mDigest, "MurmurHash64A", cDigest_StringBuffer); - rb_define_const(cDigest_MurmurHash64A, "DEFAULT_SEED", rb_usascii_str_new(DEFAULT_SEED, 8)); - rb_define_singleton_method(cDigest_MurmurHash64A, "digest", murmur64a_s_digest, -1); - rb_define_singleton_method(cDigest_MurmurHash64A, "hexdigest", murmur64a_s_hexdigest, -1); - rb_define_singleton_method(cDigest_MurmurHash64A, "rawdigest", murmur64a_s_rawdigest, -1); - rb_define_private_method(cDigest_MurmurHash64A, "finish", murmur64a_finish, 0); - rb_define_method(cDigest_MurmurHash64A, "to_i", murmur64a_to_i, 0); - rb_define_method(cDigest_MurmurHash64A, "seed", murmur_seed_get64, 0); - rb_define_method(cDigest_MurmurHash64A, "seed=", murmur_seed_set64, 1); + cDigest_MurmurHashNeutral2 = rb_path2class("Digest::MurmurHashNeutral2"); + rb_define_singleton_method(cDigest_MurmurHashNeutral2, "digest", murmur_neutral2_s_digest, -1); + rb_define_singleton_method(cDigest_MurmurHashNeutral2, "rawdigest", murmur_neutral2_s_rawdigest, -1); + rb_define_private_method(cDigest_MurmurHashNeutral2, "finish", murmur_neutral2_finish, 0); - /* class Digest::MurmurHash64B < Digest::StringBuffer */ - cDigest_MurmurHash64B = rb_define_class_under(mDigest, "MurmurHash64B", cDigest_StringBuffer); - rb_define_const(cDigest_MurmurHash64B, "DEFAULT_SEED", rb_usascii_str_new(DEFAULT_SEED, 8)); - rb_define_singleton_method(cDigest_MurmurHash64B, "digest", murmur64b_s_digest, -1); - rb_define_singleton_method(cDigest_MurmurHash64B, "hexdigest", murmur64b_s_hexdigest, -1); - rb_define_singleton_method(cDigest_MurmurHash64B, "rawdigest", murmur64b_s_rawdigest, -1); - rb_define_private_method(cDigest_MurmurHash64B, "finish", murmur64b_finish, 0); - rb_define_method(cDigest_MurmurHash64B, "to_i", murmur64b_to_i, 0); - rb_define_method(cDigest_MurmurHash64B, "seed", murmur_seed_get64, 0); - rb_define_method(cDigest_MurmurHash64B, "seed=", murmur_seed_set64, 1); - - /* class Digest::MurmurHashNeutral2 < Digest::StringBuffer */ - cDigest_MurmurHashNeutral2 = rb_define_class_under(mDigest, "MurmurHashNeutral2", cDigest_StringBuffer); - rb_define_const(cDigest_MurmurHashNeutral2, "DEFAULT_SEED", rb_usascii_str_new(DEFAULT_SEED, 4)); - rb_define_singleton_method(cDigest_MurmurHashNeutral2, "digest", murmur_neutral2_s_digest, -1); - rb_define_singleton_method(cDigest_MurmurHashNeutral2, "hexdigest", murmur_neutral2_s_hexdigest, -1); - rb_define_singleton_method(cDigest_MurmurHashNeutral2, "rawdigest", murmur_neutral2_s_rawdigest, -1); - rb_define_private_method(cDigest_MurmurHashNeutral2, "finish", murmur_neutral2_finish, 0); - rb_define_method(cDigest_MurmurHashNeutral2, "to_i", murmur_neutral2_to_i, 0); - rb_define_method(cDigest_MurmurHashNeutral2, "seed", murmur_seed_get32, 0); - rb_define_method(cDigest_MurmurHashNeutral2, "seed=", murmur_seed_set32, 1); - - /* class Digest::MurmurHashAligned2 < Digest::StringBuffer */ - cDigest_MurmurHashAligned2 = rb_define_class_under(mDigest, "MurmurHashAligned2", cDigest_StringBuffer); - rb_define_const(cDigest_MurmurHashAligned2, "DEFAULT_SEED", rb_usascii_str_new(DEFAULT_SEED, 4)); - rb_define_singleton_method(cDigest_MurmurHashAligned2, "digest", murmur_aligned2_s_digest, -1); - rb_define_singleton_method(cDigest_MurmurHashAligned2, "hexdigest", murmur_aligned2_s_hexdigest, -1); - rb_define_singleton_method(cDigest_MurmurHashAligned2, "rawdigest", murmur_aligned2_s_rawdigest, -1); - rb_define_private_method(cDigest_MurmurHashAligned2, "finish", murmur_aligned2_finish, 0); - rb_define_method(cDigest_MurmurHashAligned2, "to_i", murmur_aligned2_to_i, 0); - rb_define_method(cDigest_MurmurHashAligned2, "seed", murmur_seed_get32, 0); - rb_define_method(cDigest_MurmurHashAligned2, "seed=", murmur_seed_set32, 1); + cDigest_MurmurHashAligned2 = rb_path2class("Digest::MurmurHashAligned2"); + rb_define_singleton_method(cDigest_MurmurHashAligned2, "digest", murmur_aligned2_s_digest, -1); + rb_define_singleton_method(cDigest_MurmurHashAligned2, "rawdigest", murmur_aligned2_s_rawdigest, -1); + rb_define_private_method(cDigest_MurmurHashAligned2, "finish", murmur_aligned2_finish, 0); }