Created
March 8, 2010 14:03
-
-
Save raggi/325184 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class String | |
def hash18 | |
# cheeky integer truncate TODO move to bitmask, and method | |
trunc = lambda { |v| [v].pack('i').unpack('i').first } | |
key = 0 | |
each_byte do |b| | |
key = trunc.call(trunc.call(key*65599) + b) | |
end | |
trunc.call(key + trunc.call(key >> 5)) | |
end | |
end | |
require 'rubygems' | |
require 'minitest/unit' | |
include MiniTest::Assertions | |
chars = %w[ | |
a b c d e f g h i j k l m n o p q r s t u v w x y z 0 1 2 3 4 5 6 7 8 9 | |
] | |
chash = [ | |
100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, | |
115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 49, 50, 51, 52, 53, | |
54, 55, 56, 57, 58 | |
] | |
chars.zip(chash).each do |s, e| | |
assert_equal e, s.hash18, "#{s.inspect}.hash18()" | |
end | |
strings = %w[abc def ghi jkl] | |
hashes = [833038373, 858800354, 884562335, 910324316] | |
strings.zip(hashes).each do |s, e| | |
assert_equal e, s.hash18, "#{s.inspect}.hash18()" | |
end | |
lorems = %w[ | |
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus dolor | |
urna, pulvinar eget laoreet pretium, vehicula nec mi. Nunc aliquam sapien | |
rhoncus nisl euismod eu accumsan justo consectetur. Nam vel ante eget libero | |
interdum porttitor. Ut dolor arcu, dignissim sit amet aliquam at, ultricies | |
at ante. Morbi vehicula dignissim orci, in semper est pretium ut. Proin at | |
odio nulla. Vivamus posuere, lectus ac ultrices suscipit, neque orci euismod | |
arcu, nec ullamcorper eros elit ornare dolor. Phasellus metus tellus, | |
consectetur et tincidunt eu, congue vel eros. Nam ac tortor nunc, vel auctor | |
erat. Mauris consectetur est sed nisl blandit placerat. Duis arcu ligula, | |
dictum vel euismod a, sagittis gravida purus. Nulla sit amet ullamcorper | |
lectus. Vivamus condimentum pellentesque tristique. | |
] | |
lorems_hashes = lorems.map { |s| s.hash } | |
lorems.zip(lorems_hashes).each do |s, e| | |
assert_equal e, s.hash18, "#{s.inspect}.hash18()" | |
end | |
bigstr = <<-PLAIN | |
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus dolor urna, | |
pulvinar eget laoreet pretium, vehicula nec mi. Nunc aliquam sapien rhoncus | |
nisl euismod eu accumsan justo consectetur. Nam vel ante eget libero interdum | |
porttitor. Ut dolor arcu, dignissim sit amet aliquam at, ultricies at ante. | |
Morbi vehicula dignissim orci, in semper est pretium ut. Proin at odio nulla. | |
Vivamus posuere, lectus ac ultrices suscipit, neque orci euismod arcu, nec | |
ullamcorper eros elit ornare dolor. Phasellus metus tellus, consectetur et | |
tincidunt eu, congue vel eros. Nam ac tortor nunc, vel auctor erat. Mauris | |
consectetur est sed nisl blandit placerat. Duis arcu ligula, dictum vel | |
euismod a, sagittis gravida purus. Nulla sit amet ullamcorper lectus. Vivamus | |
condimentum pellentesque tristique. | |
PLAIN | |
bigstr_hash = bigstr.hash | |
assert_equal bigstr_hash, bigstr.hash18, "#{bigstr.inspect}.hash18()" |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment