sfh 1.0.0
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/README +20 -0
- data/bin/sfhsum +17 -0
- data/ext/extconf.rb +6 -0
- data/ext/sfh.c +78 -0
- data/ext/sfh.i +3 -0
- data/ext/sfh_wrap.c +1981 -0
- data/ext/test_sfh_swig.rb +5 -0
- data/gemspec.rb +32 -0
- data/sfh.rb +66 -0
- data/test_sfh.rb +15 -0
- metadata +58 -0
data/gemspec.rb
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'rake'
|
2
|
+
require 'mkmf'
|
3
|
+
|
4
|
+
SPEC = Gem::Specification.new do |spec|
|
5
|
+
spec.name = "sfh"
|
6
|
+
spec.version = "1.0.0"
|
7
|
+
spec.summary = "A gem for SuperFastHash (http://www.azillionmonkeys.com/qed/hash.html)"
|
8
|
+
spec.author = "Jonathan Wilkins"
|
9
|
+
spec.email = "jwilkins[at]nospam[dot]bitland[dot]net"
|
10
|
+
spec.has_rdoc = true
|
11
|
+
spec.extra_rdoc_files = ["README"]
|
12
|
+
spec.require_path = "."
|
13
|
+
spec.autorequire = "sfh.rb"
|
14
|
+
|
15
|
+
unfiltered_files = FileList['*', 'examples/*', 'bin/*', 'ext/*']
|
16
|
+
spec.files = unfiltered_files.delete_if do |filename|
|
17
|
+
filename.include?(".gem") || filename.include?("Makefile") ||
|
18
|
+
filename.include?(".so") || filename.include?(".o")
|
19
|
+
end
|
20
|
+
spec.executables = ['sfhsum']
|
21
|
+
|
22
|
+
# optional native component
|
23
|
+
if cc_command
|
24
|
+
spec.extensions << 'ext/extconf.rb'
|
25
|
+
end
|
26
|
+
|
27
|
+
puts "Building gem w/ "
|
28
|
+
spec.files.each do |f|
|
29
|
+
puts "- #{f}"
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
data/sfh.rb
ADDED
@@ -0,0 +1,66 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'inline'
|
3
|
+
|
4
|
+
class Sfh
|
5
|
+
inline(:C) do |builder|
|
6
|
+
builder.include '<stdio.h>'
|
7
|
+
builder.include '<sys/types.h>'
|
8
|
+
builder.include '<stdint.h>'
|
9
|
+
|
10
|
+
builder.c '
|
11
|
+
unsigned int hash(const char * data, int len)
|
12
|
+
{
|
13
|
+
unsigned int hash = len, tmp;
|
14
|
+
int rem;
|
15
|
+
|
16
|
+
if (len <= 0 || data == NULL) return 0;
|
17
|
+
|
18
|
+
rem = len & 3;
|
19
|
+
len >>= 2;
|
20
|
+
|
21
|
+
/* Main loop */
|
22
|
+
for (;len > 0; len--) {
|
23
|
+
hash += (*((const uint16_t *) (data)));
|
24
|
+
tmp = ((*((const uint16_t *) (data+2))) << 11) ^ hash;
|
25
|
+
hash = (hash << 16) ^ tmp;
|
26
|
+
data += 2*sizeof (unsigned short);
|
27
|
+
hash += hash >> 11;
|
28
|
+
}
|
29
|
+
|
30
|
+
/* Handle end cases */
|
31
|
+
switch (rem) {
|
32
|
+
case 3: hash += (*((const uint16_t *) (data)));
|
33
|
+
hash ^= hash << 16;
|
34
|
+
hash ^= data[sizeof (unsigned short)] << 18;
|
35
|
+
hash += hash >> 11;
|
36
|
+
break;
|
37
|
+
case 2: hash += (*((const uint16_t *) (data)));
|
38
|
+
hash ^= hash << 11;
|
39
|
+
hash += hash >> 17;
|
40
|
+
break;
|
41
|
+
case 1: hash += *data;
|
42
|
+
hash ^= hash << 10;
|
43
|
+
hash += hash >> 1;
|
44
|
+
}
|
45
|
+
|
46
|
+
/* Force "avalanching" of final 127 bits */
|
47
|
+
hash ^= hash << 3;
|
48
|
+
hash += hash >> 5;
|
49
|
+
hash ^= hash << 4;
|
50
|
+
hash += hash >> 17;
|
51
|
+
hash ^= hash << 25;
|
52
|
+
hash += hash >> 6;
|
53
|
+
|
54
|
+
return hash;
|
55
|
+
}
|
56
|
+
'
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
if $0 == __FILE__
|
61
|
+
h = Sfh.new()
|
62
|
+
puts "hashing 'asdf' a million times"
|
63
|
+
1000000.times {
|
64
|
+
h.hash('asdf', 4)
|
65
|
+
}
|
66
|
+
end
|
data/test_sfh.rb
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'sfh'
|
2
|
+
|
3
|
+
str = 'asdf'
|
4
|
+
times = 1000000
|
5
|
+
|
6
|
+
h = Sfh.new
|
7
|
+
puts "hashing #{str} #{times} times"
|
8
|
+
times.times { h.hash(str, str.length) }
|
9
|
+
puts "done"
|
10
|
+
|
11
|
+
times = 1000
|
12
|
+
puts "hashing #{str}*1000000 #{times} times"
|
13
|
+
str = str*1000000
|
14
|
+
times.times { h.hash(str, str.length) }
|
15
|
+
puts "done"
|
metadata
ADDED
@@ -0,0 +1,58 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
rubygems_version: 0.9.4
|
3
|
+
specification_version: 1
|
4
|
+
name: sfh
|
5
|
+
version: !ruby/object:Gem::Version
|
6
|
+
version: 1.0.0
|
7
|
+
date: 2008-02-17 00:00:00 -08:00
|
8
|
+
summary: A gem for SuperFastHash (http://www.azillionmonkeys.com/qed/hash.html)
|
9
|
+
require_paths:
|
10
|
+
- .
|
11
|
+
email: jwilkins[at]nospam[dot]bitland[dot]net
|
12
|
+
homepage:
|
13
|
+
rubyforge_project:
|
14
|
+
description:
|
15
|
+
autorequire: sfh.rb
|
16
|
+
default_executable:
|
17
|
+
bindir: bin
|
18
|
+
has_rdoc: true
|
19
|
+
required_ruby_version: !ruby/object:Gem::Version::Requirement
|
20
|
+
requirements:
|
21
|
+
- - ">"
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: 0.0.0
|
24
|
+
version:
|
25
|
+
platform: ruby
|
26
|
+
signing_key:
|
27
|
+
cert_chain:
|
28
|
+
post_install_message:
|
29
|
+
authors:
|
30
|
+
- Jonathan Wilkins
|
31
|
+
files:
|
32
|
+
- sfh.rb
|
33
|
+
- README
|
34
|
+
- test_sfh.rb
|
35
|
+
- examples
|
36
|
+
- ext
|
37
|
+
- bin
|
38
|
+
- gemspec.rb
|
39
|
+
- bin/sfhsum
|
40
|
+
- ext/sfh.c
|
41
|
+
- ext/test_sfh_swig.rb
|
42
|
+
- ext/sfh_wrap.c
|
43
|
+
- ext/sfh.i
|
44
|
+
- ext/extconf.rb
|
45
|
+
test_files: []
|
46
|
+
|
47
|
+
rdoc_options: []
|
48
|
+
|
49
|
+
extra_rdoc_files:
|
50
|
+
- README
|
51
|
+
executables:
|
52
|
+
- sfhsum
|
53
|
+
extensions:
|
54
|
+
- ext/extconf.rb
|
55
|
+
requirements: []
|
56
|
+
|
57
|
+
dependencies: []
|
58
|
+
|