rbfnv 0.3

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.
data/CHANGELOG ADDED
@@ -0,0 +1,3 @@
1
+ v0.3 - Fixed 64-bit hashes and pushed as gem on http://rubygems.org
2
+
3
+ v0.1 - Imported robey's implementation
data/Manifest ADDED
@@ -0,0 +1,7 @@
1
+ CHANGELOG
2
+ Manifest
3
+ README.rdoc
4
+ Rakefile
5
+ ext/extconf.rb
6
+ ext/fnv.c
7
+ test/unit/fnv_test.rb
data/README.rdoc ADDED
@@ -0,0 +1,25 @@
1
+ = rbfnv
2
+
3
+ * http://github.com/nileshtrivedi/rbfnv
4
+
5
+ == DESCRIPTION:
6
+
7
+ FNV hash implementation in C
8
+
9
+ == USAGE:
10
+
11
+ require 'rbfnv'
12
+ Rbfnv.fnv1_32("cat") # > 983016379
13
+ Rbfnv.fnv1a_32("cat") # > 108289031
14
+ Rbfnv.fnv1_64("cat") # > 15624606792861450203
15
+ Rbfnv.fnv1a_64("cat") # > 17718013163177550631
16
+
17
+ == INSTALL:
18
+
19
+ sudo gem install rbfnv
20
+
21
+ == AUTHORS:
22
+
23
+ robey[http://github.com/robey] - Initial implementaion
24
+
25
+ nileshtrivedi[http://github.com/nileshtrivedi] - Fix for 64-bit hashes
data/Rakefile ADDED
@@ -0,0 +1,9 @@
1
+
2
+ require 'echoe'
3
+
4
+ Echoe.new("rbfnv") do |p|
5
+ p.author = "Robey Pointer, Nilesh Trivedi"
6
+ p.project = "rbfnv"
7
+ p.summary = "FNV hash implementation for ruby"
8
+ p.rdoc_pattern = /README|TODO|LICENSE|CHANGELOG|BENCH|COMPAT|exceptions|behaviors|rails.rb/
9
+ end
data/ext/extconf.rb ADDED
@@ -0,0 +1,10 @@
1
+
2
+ require 'mkmf'
3
+
4
+ $CFLAGS << " -O3"
5
+ if ENV['DEBUG']
6
+ puts "setting debug flags"
7
+ $CFLAGS << " -ggdb -DHAVE_DEBUG"
8
+ end
9
+
10
+ create_makefile 'rbfnv'
data/ext/fnv.c ADDED
@@ -0,0 +1,89 @@
1
+ #include <stdint.h>
2
+ #include "ruby.h"
3
+
4
+ #define PRIME32 16777619
5
+ #define PRIME64 1099511628211ULL
6
+
7
+
8
+ /**
9
+ * FNV fast hashing algorithm in 32 bits.
10
+ * @see http://en.wikipedia.org/wiki/Fowler_Noll_Vo_hash
11
+ */
12
+ static inline uint32_t fnv1_32(const char *data, uint32_t len) {
13
+ uint32_t rv = 0x811c9dc5U;
14
+ uint32_t i;
15
+ for (i = 0; i < len; i++) {
16
+ rv = (rv * PRIME32) ^ (unsigned char)(data[i]);
17
+ }
18
+ return rv;
19
+ }
20
+
21
+ /**
22
+ * FNV fast hashing algorithm in 32 bits, variant with operations reversed.
23
+ * @see http://en.wikipedia.org/wiki/Fowler_Noll_Vo_hash
24
+ */
25
+ static inline uint32_t fnv1a_32(const char *data, uint32_t len) {
26
+ uint32_t rv = 0x811c9dc5U;
27
+ uint32_t i;
28
+ for (i = 0; i < len; i++) {
29
+ rv = (rv ^ (unsigned char)data[i]) * PRIME32;
30
+ }
31
+ return rv;
32
+ }
33
+
34
+ /**
35
+ * FNV fast hashing algorithm in 64 bits.
36
+ * @see http://en.wikipedia.org/wiki/Fowler_Noll_Vo_hash
37
+ */
38
+ static inline uint64_t fnv1_64(const char *data, uint32_t len) {
39
+ uint64_t rv = 0xcbf29ce484222325ULL;
40
+ uint32_t i;
41
+ for (i = 0; i < len; i++) {
42
+ rv = (rv * PRIME64) ^ (unsigned char)data[i];
43
+ }
44
+ return (uint64_t)rv;
45
+ }
46
+
47
+ /**
48
+ * FNV fast hashing algorithm in 64 bits, variant with operations reversed.
49
+ * @see http://en.wikipedia.org/wiki/Fowler_Noll_Vo_hash
50
+ */
51
+ static inline uint64_t fnv1a_64(const char *data, uint32_t len) {
52
+ uint64_t rv = 0xcbf29ce484222325ULL;
53
+ uint32_t i;
54
+ for (i = 0; i < len; i++) {
55
+ rv = (rv ^ (unsigned char)data[i]) * PRIME64;
56
+ }
57
+ return (uint64_t)rv;
58
+ }
59
+
60
+
61
+ /* ----- ruby bindings ----- */
62
+
63
+ static VALUE rbfnv_fnv1_32(VALUE self, VALUE data) {
64
+ return UINT2NUM(fnv1_32(RSTRING(data)->ptr, RSTRING(data)->len));
65
+ }
66
+
67
+ static VALUE rbfnv_fnv1a_32(VALUE self, VALUE data) {
68
+ return UINT2NUM(fnv1a_32(RSTRING(data)->ptr, RSTRING(data)->len));
69
+ }
70
+
71
+ static VALUE rbfnv_fnv1_64(VALUE self, VALUE data) {
72
+ return ULL2NUM(fnv1_64(RSTRING(data)->ptr, RSTRING(data)->len));
73
+ }
74
+
75
+ static VALUE rbfnv_fnv1a_64(VALUE self, VALUE data) {
76
+ return ULL2NUM(fnv1a_64(RSTRING(data)->ptr, RSTRING(data)->len));
77
+ }
78
+
79
+
80
+ static VALUE rb_rbfnv;
81
+
82
+ void Init_rbfnv() {
83
+ /* nothing here yet */
84
+ rb_rbfnv = rb_define_module("Rbfnv");
85
+ rb_define_singleton_method(rb_rbfnv, "fnv1_32", rbfnv_fnv1_32, 1);
86
+ rb_define_singleton_method(rb_rbfnv, "fnv1a_32", rbfnv_fnv1a_32, 1);
87
+ rb_define_singleton_method(rb_rbfnv, "fnv1_64", rbfnv_fnv1_64, 1);
88
+ rb_define_singleton_method(rb_rbfnv, "fnv1a_64", rbfnv_fnv1a_64, 1);
89
+ }
data/rbfnv.gemspec ADDED
@@ -0,0 +1,31 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ Gem::Specification.new do |s|
4
+ s.name = %q{rbfnv}
5
+ s.version = "0.3"
6
+
7
+ s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
8
+ s.authors = ["Robey Pointer, Nilesh Trivedi"]
9
+ s.date = %q{2011-01-18}
10
+ s.description = %q{FNV hash implementation for ruby}
11
+ s.email = %q{}
12
+ s.extensions = ["ext/extconf.rb"]
13
+ s.extra_rdoc_files = ["CHANGELOG", "README.rdoc"]
14
+ s.files = ["CHANGELOG", "Manifest", "README.rdoc", "Rakefile", "ext/extconf.rb", "ext/fnv.c", "test/unit/fnv_test.rb", "rbfnv.gemspec"]
15
+ s.homepage = %q{}
16
+ s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Rbfnv", "--main", "README.rdoc"]
17
+ s.require_paths = ["ext"]
18
+ s.rubyforge_project = %q{rbfnv}
19
+ s.rubygems_version = %q{1.4.1}
20
+ s.summary = %q{FNV hash implementation for ruby}
21
+ s.test_files = ["test/unit/fnv_test.rb"]
22
+
23
+ if s.respond_to? :specification_version then
24
+ s.specification_version = 3
25
+
26
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
27
+ else
28
+ end
29
+ else
30
+ end
31
+ end
@@ -0,0 +1,34 @@
1
+ require "test/unit"
2
+ require "rbfnv"
3
+
4
+ LONGKEY = "the easter island statue memorial tabernacle choir presents"
5
+
6
+ class FnvTest < Test::Unit::TestCase
7
+ def test_fnv1_32
8
+ assert_nothing_raised { Rbfnv }
9
+ assert_equal Rbfnv.fnv1_32(""), 2166136261
10
+ assert_equal Rbfnv.fnv1_32("cat"), 983016379
11
+ assert_equal Rbfnv.fnv1_32(LONGKEY), 2223726839
12
+ end
13
+
14
+ def test_fnv1a_32
15
+ assert_nothing_raised { Rbfnv }
16
+ assert_equal Rbfnv.fnv1a_32(""), 2166136261
17
+ assert_equal Rbfnv.fnv1a_32("cat"), 108289031
18
+ assert_equal Rbfnv.fnv1a_32(LONGKEY), 1968151335
19
+ end
20
+
21
+ def test_fnv1_64
22
+ assert_nothing_raised { Rbfnv }
23
+ assert_equal Rbfnv.fnv1_64(""), 14695981039346656037
24
+ assert_equal Rbfnv.fnv1_64("cat"), 15624606792861450203
25
+ assert_equal Rbfnv.fnv1_64(LONGKEY), 6216328457121903479
26
+ end
27
+
28
+ def test_fnv1a_64
29
+ assert_nothing_raised { Rbfnv }
30
+ assert_equal Rbfnv.fnv1a_64(""), 14695981039346656037
31
+ assert_equal Rbfnv.fnv1a_64("cat"), 17718013163177550631
32
+ assert_equal Rbfnv.fnv1a_64(LONGKEY), 3347195641695891815
33
+ end
34
+ end
metadata ADDED
@@ -0,0 +1,80 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rbfnv
3
+ version: !ruby/object:Gem::Version
4
+ hash: 13
5
+ prerelease:
6
+ segments:
7
+ - 0
8
+ - 3
9
+ version: "0.3"
10
+ platform: ruby
11
+ authors:
12
+ - Robey Pointer, Nilesh Trivedi
13
+ autorequire:
14
+ bindir: bin
15
+ cert_chain: []
16
+
17
+ date: 2011-01-18 00:00:00 +05:30
18
+ default_executable:
19
+ dependencies: []
20
+
21
+ description: FNV hash implementation for ruby
22
+ email: ""
23
+ executables: []
24
+
25
+ extensions:
26
+ - ext/extconf.rb
27
+ extra_rdoc_files:
28
+ - CHANGELOG
29
+ - README.rdoc
30
+ files:
31
+ - CHANGELOG
32
+ - Manifest
33
+ - README.rdoc
34
+ - Rakefile
35
+ - ext/extconf.rb
36
+ - ext/fnv.c
37
+ - test/unit/fnv_test.rb
38
+ - rbfnv.gemspec
39
+ has_rdoc: true
40
+ homepage: ""
41
+ licenses: []
42
+
43
+ post_install_message:
44
+ rdoc_options:
45
+ - --line-numbers
46
+ - --inline-source
47
+ - --title
48
+ - Rbfnv
49
+ - --main
50
+ - README.rdoc
51
+ require_paths:
52
+ - ext
53
+ required_ruby_version: !ruby/object:Gem::Requirement
54
+ none: false
55
+ requirements:
56
+ - - ">="
57
+ - !ruby/object:Gem::Version
58
+ hash: 3
59
+ segments:
60
+ - 0
61
+ version: "0"
62
+ required_rubygems_version: !ruby/object:Gem::Requirement
63
+ none: false
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ hash: 11
68
+ segments:
69
+ - 1
70
+ - 2
71
+ version: "1.2"
72
+ requirements: []
73
+
74
+ rubyforge_project: rbfnv
75
+ rubygems_version: 1.4.1
76
+ signing_key:
77
+ specification_version: 3
78
+ summary: FNV hash implementation for ruby
79
+ test_files:
80
+ - test/unit/fnv_test.rb