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 +3 -0
- data/Manifest +7 -0
- data/README.rdoc +25 -0
- data/Rakefile +9 -0
- data/ext/extconf.rb +10 -0
- data/ext/fnv.c +89 -0
- data/rbfnv.gemspec +31 -0
- data/test/unit/fnv_test.rb +34 -0
- metadata +80 -0
data/CHANGELOG
ADDED
data/Manifest
ADDED
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
data/ext/extconf.rb
ADDED
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
|