digest-murmurhash 0.2.1 → 0.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 635a6c34802609c512789d68c9ebe571df48cc01
4
- data.tar.gz: 1a1884fb59d6a9ccfca3c5da969e688589c093f0
3
+ metadata.gz: 9c86a438d6be0a5ac713575a874d2b468e3b5f0a
4
+ data.tar.gz: 299f5d61350a387d79ddacc490c00cef42950ef8
5
5
  SHA512:
6
- metadata.gz: 2633494b6b099a2149deeb3c39af1eb81e80435156bc459b4aee9498ca5209f41ac5a400713b6ae6c762935c5a1d964bc408e63a6e21e0634778d4a78c63f329
7
- data.tar.gz: 9c61561046045532d0c8fe863059625cb532d051ea978f16fc63b0bd7fada9fded44900d91642695253d50fd94344c9444d35d5e6715b2956c2078713bcd9fd2
6
+ metadata.gz: 29cb4f0444b18e28e5034b99f77a8136195382710d0638cacec00eae8eb5b0cbfcfe8e8fc17418d2185293d99182738241551b15ab726a3d8bde0d4bd5d44f4d
7
+ data.tar.gz: 79d3dc13c2d115862860747214e57607be3a9d060c48bfbb27169e093435817cf264b449fa6e27f02896bc9763a8cda4290da190eb2c545960a4403f6c6e609e
data/README.md CHANGED
@@ -8,6 +8,8 @@
8
8
 
9
9
  **Digest::MurmurHash2** use algorithm MurmurHash2(32-bit).
10
10
 
11
+ **Digest::MurmurHash2A** use algorithm MurmurHash2A(32-bit).
12
+
11
13
  (**Digest::MurmurHash** exist to write only version number)
12
14
 
13
15
  All classes compliance Digest API of Ruby.
@@ -36,6 +38,8 @@ p Digest::MurmurHash2.file("./LICENSE.txt").hexdigest #=> '78678326'
36
38
 
37
39
  **Digest::MurmurHash2** < Digest::StringBuffer
38
40
 
41
+ **Digest::MurmurHash2A** < Digest::StringBuffer
42
+
39
43
  ## Installation
40
44
 
41
45
  Add this line to your application's Gemfile:
@@ -10,7 +10,6 @@ Init_murmurhash(void)
10
10
  VALUE cDigest_MurmurHash1, cDigest_MurmurHash2, cDigest_MurmurHash2A;
11
11
 
12
12
  /* Digest::MurmurHash is require that Digest::StringBuffer */
13
- rb_require("digest/stringbuffer");
14
13
  mDigest = rb_path2class("Digest");
15
14
  cDigest_StringBuffer = rb_path2class("Digest::StringBuffer");
16
15
 
@@ -18,17 +17,23 @@ Init_murmurhash(void)
18
17
  cDigest_MurmurHash1 = rb_define_class_under(mDigest, "MurmurHash1", cDigest_StringBuffer);
19
18
  rb_define_private_method(cDigest_MurmurHash1, "finish", murmur1_finish, 0);
20
19
  rb_define_method(cDigest_MurmurHash1, "to_i", murmur1_to_i, 0);
20
+ rb_define_singleton_method(cDigest_MurmurHash1, "digest", murmur1_s_digest, -1);
21
+ rb_define_singleton_method(cDigest_MurmurHash1, "hexdigest", murmur1_s_hexdigest, -1);
21
22
  rb_define_singleton_method(cDigest_MurmurHash1, "rawdigest", murmur1_s_rawdigest, -1);
22
23
 
23
24
  /* class Digest::MurmurHash2 < Digest::StringBuffer */
24
25
  cDigest_MurmurHash2 = rb_define_class_under(mDigest, "MurmurHash2", cDigest_StringBuffer);
25
26
  rb_define_private_method(cDigest_MurmurHash2, "finish", murmur2_finish, 0);
26
27
  rb_define_method(cDigest_MurmurHash2, "to_i", murmur2_to_i, 0);
28
+ rb_define_singleton_method(cDigest_MurmurHash2, "digest", murmur2_s_digest, -1);
29
+ rb_define_singleton_method(cDigest_MurmurHash2, "hexdigest", murmur2_s_hexdigest, -1);
27
30
  rb_define_singleton_method(cDigest_MurmurHash2, "rawdigest", murmur2_s_rawdigest, -1);
28
31
 
29
32
  /* class Digest::MurmurHash2A < Digest::StringBuffer */
30
33
  cDigest_MurmurHash2A = rb_define_class_under(mDigest, "MurmurHash2A", cDigest_StringBuffer);
31
34
  rb_define_private_method(cDigest_MurmurHash2A, "finish", murmur2a_finish, 0);
32
35
  rb_define_method(cDigest_MurmurHash2A, "to_i", murmur2a_to_i, 0);
36
+ rb_define_singleton_method(cDigest_MurmurHash2A, "digest", murmur2a_s_digest, -1);
37
+ rb_define_singleton_method(cDigest_MurmurHash2A, "hexdigest", murmur2a_s_hexdigest, -1);
33
38
  rb_define_singleton_method(cDigest_MurmurHash2A, "rawdigest", murmur2a_s_rawdigest, -1);
34
39
  }
@@ -19,5 +19,43 @@ typedef struct {
19
19
  rb_raise(rb_eArgError, "NULL found for " # name " when shouldn't be.'"); \
20
20
  }
21
21
 
22
+ /*
23
+ * from https://github.com/ruby/ruby/blob/trunk/ext/digest/digest.c
24
+ * Copyright (C) 1995-2001 Yukihiro Matsumoto
25
+ * Copyright (C) 2001-2006 Akinori MUSHA
26
+ */
27
+ static VALUE
28
+ hexencode_str_new(VALUE str_digest)
29
+ {
30
+ char *digest;
31
+ size_t digest_len;
32
+ size_t i;
33
+ VALUE str;
34
+ char *p;
35
+ static const char hex[] = {
36
+ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
37
+ 'a', 'b', 'c', 'd', 'e', 'f'
38
+ };
39
+
40
+ StringValue(str_digest);
41
+ digest = RSTRING_PTR(str_digest);
42
+ digest_len = RSTRING_LEN(str_digest);
43
+
44
+ if (LONG_MAX / 2 < digest_len) {
45
+ rb_raise(rb_eRuntimeError, "digest string too long");
46
+ }
47
+
48
+ str = rb_usascii_str_new(0, digest_len * 2);
49
+
50
+ for (i = 0, p = RSTRING_PTR(str); i < digest_len; i++) {
51
+ unsigned char byte = digest[i];
52
+
53
+ p[i + i] = hex[byte >> 4];
54
+ p[i + i + 1] = hex[byte & 0x0f];
55
+ }
56
+
57
+ return str;
58
+ }
59
+
22
60
  #endif /* ifndef MURMURHASH_INCLUDED */
23
61
 
@@ -69,6 +69,37 @@ murmur1_to_i(VALUE self)
69
69
  return UINT2NUM(murmur_hash_process1(ptr->buffer, ptr->p - ptr->buffer));
70
70
  }
71
71
 
72
+ VALUE
73
+ murmur1_s_digest(int argc, VALUE *argv, VALUE klass)
74
+ {
75
+ VALUE str;
76
+ uint32_t h;
77
+ uint8_t digest[4];
78
+
79
+ if (argc < 1)
80
+ rb_raise(rb_eArgError, "no data given");
81
+
82
+ str = *argv++;
83
+ argc--;
84
+
85
+ StringValue(str);
86
+
87
+ h = murmur_hash_process1(RSTRING_PTR(str), RSTRING_LEN(str));
88
+
89
+ digest[0] = h >> 24;
90
+ digest[1] = h >> 16;
91
+ digest[2] = h >> 8;
92
+ digest[3] = h;
93
+
94
+ return rb_str_new((const char*) digest, 4);
95
+ }
96
+
97
+ VALUE
98
+ murmur1_s_hexdigest(int argc, VALUE *argv, VALUE klass)
99
+ {
100
+ return hexencode_str_new(murmur1_s_digest(argc, argv, klass));
101
+ }
102
+
72
103
  VALUE
73
104
  murmur1_s_rawdigest(int argc, VALUE *argv, VALUE klass)
74
105
  {
@@ -5,6 +5,8 @@
5
5
 
6
6
  VALUE murmur1_finish(VALUE self);
7
7
  VALUE murmur1_to_i(VALUE self);
8
+ VALUE murmur1_s_digest(int argc, VALUE *argv, VALUE klass);
9
+ VALUE murmur1_s_hexdigest(int argc, VALUE *argv, VALUE klass);
8
10
  VALUE murmur1_s_rawdigest(int argc, VALUE *argv, VALUE klass);
9
11
 
10
12
  #endif /* ifndef MURMURHASH1_INCLUDED */
@@ -71,11 +71,41 @@ murmur2_to_i(VALUE self)
71
71
  return UINT2NUM(murmur_hash_process2(ptr->buffer, ptr->p - ptr->buffer));
72
72
  }
73
73
 
74
+ VALUE
75
+ murmur2_s_digest(int argc, VALUE *argv, VALUE klass)
76
+ {
77
+ VALUE str;
78
+ uint32_t h;
79
+ uint8_t digest[4];
80
+
81
+ if (argc < 1)
82
+ rb_raise(rb_eArgError, "no data given");
83
+
84
+ str = *argv++;
85
+ argc--;
86
+
87
+ StringValue(str);
88
+
89
+ h = murmur_hash_process2(RSTRING_PTR(str), RSTRING_LEN(str));
90
+
91
+ digest[0] = h >> 24;
92
+ digest[1] = h >> 16;
93
+ digest[2] = h >> 8;
94
+ digest[3] = h;
95
+
96
+ return rb_str_new((const char*) digest, 4);
97
+ }
98
+
99
+ VALUE
100
+ murmur2_s_hexdigest(int argc, VALUE *argv, VALUE klass)
101
+ {
102
+ return hexencode_str_new(murmur2_s_digest(argc, argv, klass));
103
+ }
104
+
74
105
  VALUE
75
106
  murmur2_s_rawdigest(int argc, VALUE *argv, VALUE klass)
76
107
  {
77
108
  VALUE str;
78
- volatile VALUE obj;
79
109
 
80
110
  if (argc < 1)
81
111
  rb_raise(rb_eArgError, "no data given");
@@ -5,6 +5,8 @@
5
5
 
6
6
  VALUE murmur2_finish(VALUE self);
7
7
  VALUE murmur2_to_i(VALUE self);
8
+ VALUE murmur2_s_digest(int argc, VALUE *argv, VALUE klass);
9
+ VALUE murmur2_s_hexdigest(int argc, VALUE *argv, VALUE klass);
8
10
  VALUE murmur2_s_rawdigest(int argc, VALUE *argv, VALUE klass);
9
11
 
10
12
  #endif /* ifndef MURMURHASH2_INCLUDED */
@@ -65,11 +65,41 @@ murmur2a_to_i(VALUE self)
65
65
  return UINT2NUM(murmur_hash_process2a(ptr->buffer, ptr->p - ptr->buffer));
66
66
  }
67
67
 
68
+ VALUE
69
+ murmur2a_s_digest(int argc, VALUE *argv, VALUE klass)
70
+ {
71
+ VALUE str;
72
+ uint32_t h;
73
+ uint8_t digest[4];
74
+
75
+ if (argc < 1)
76
+ rb_raise(rb_eArgError, "no data given");
77
+
78
+ str = *argv++;
79
+ argc--;
80
+
81
+ StringValue(str);
82
+
83
+ h = murmur_hash_process2a(RSTRING_PTR(str), RSTRING_LEN(str));
84
+
85
+ digest[0] = h >> 24;
86
+ digest[1] = h >> 16;
87
+ digest[2] = h >> 8;
88
+ digest[3] = h;
89
+
90
+ return rb_str_new((const char*) digest, 4);
91
+ }
92
+
93
+ VALUE
94
+ murmur2a_s_hexdigest(int argc, VALUE *argv, VALUE klass)
95
+ {
96
+ return hexencode_str_new(murmur2a_s_digest(argc, argv, klass));
97
+ }
98
+
68
99
  VALUE
69
100
  murmur2a_s_rawdigest(int argc, VALUE *argv, VALUE klass)
70
101
  {
71
102
  VALUE str;
72
- volatile VALUE obj;
73
103
 
74
104
  if (argc < 1)
75
105
  rb_raise(rb_eArgError, "no data given");
@@ -5,6 +5,8 @@
5
5
 
6
6
  VALUE murmur2a_finish(VALUE self);
7
7
  VALUE murmur2a_to_i(VALUE self);
8
+ VALUE murmur2a_s_digest(int argc, VALUE *argv, VALUE klass);
9
+ VALUE murmur2a_s_hexdigest(int argc, VALUE *argv, VALUE klass);
8
10
  VALUE murmur2a_s_rawdigest(int argc, VALUE *argv, VALUE klass);
9
11
 
10
12
  #endif /* ifndef MURMURHASH2A_INCLUDED */
@@ -1,3 +1,4 @@
1
+ require "digest/stringbuffer"
1
2
  begin
2
3
  require "digest/murmurhash/#{RUBY_VERSION[/\d+.\d+/]}/murmurhash"
3
4
  rescue LoadError
@@ -1,5 +1,5 @@
1
1
  module Digest
2
2
  class MurmurHash
3
- VERSION = "0.2.1"
3
+ VERSION = "0.2.2"
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: digest-murmurhash
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 0.2.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - ksss
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-12-08 00:00:00.000000000 Z
11
+ date: 2013-12-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler