Skip to content

Instantly share code, notes, and snippets.

@raggi
Created March 8, 2010 14:03
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save raggi/325184 to your computer and use it in GitHub Desktop.
Save raggi/325184 to your computer and use it in GitHub Desktop.
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