public
Last active

Simple bijective function (base(n) encode/decode)

  • Download Gist
bijective.rb
Ruby
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
# Simple bijective function
# Basically encodes any integer into a base(n) string,
# where n is ALPHABET.length.
# Based on pseudocode from http://stackoverflow.com/questions/742013/how-to-code-a-url-shortener/742047#742047
 
ALPHABET =
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789".split(//)
# make your own alphabet using:
# (('a'..'z').to_a + ('A'..'Z').to_a + (0..9).to_a).shuffle.join
 
def bijective_encode(i)
# from http://refactormycode.com/codes/125-base-62-encoding
# with only minor modification
return ALPHABET[0] if i == 0
s = ''
base = ALPHABET.length
while i > 0
s << ALPHABET[i.modulo(base)]
i /= base
end
s.reverse
end
 
def bijective_decode(s)
# based on base2dec() in Tcl translation
# at http://rosettacode.org/wiki/Non-decimal_radices/Convert#Ruby
i = 0
base = ALPHABET.length
s.each_char { |c| i = i * base + ALPHABET.index(c) }
i
end
 
# Two little demos:
 
# Encoding ints, decoding them back:
num = 125
(num..(num+10)).each do |i|
print i, " ", bijective_encode(i), " ", bijective_decode(bijective_encode(i)), "\n"
end
 
# Decoding string mentioned in original SO question:
puts bijective_decode("e9a")

Please sign in to comment on this gist.

Something went wrong with that request. Please try again.