fixed_length_encoder 0.0.1 → 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/lib/fixed_length_encoder.rb +64 -19
- metadata +7 -7
data/lib/fixed_length_encoder.rb
CHANGED
@@ -1,25 +1,70 @@
|
|
1
|
-
|
2
|
-
ALPHABET = '
|
3
|
-
|
4
|
-
|
5
|
-
def self.encode(value,
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
remainder = value % BASE
|
10
|
-
message += ALPHABET[remainder]
|
11
|
-
value = (value - remainder)/BASE
|
12
|
-
end
|
13
|
-
message
|
1
|
+
module FixedLengthEncoder
|
2
|
+
ALPHABET = 'QkzHJPxlXtZrTYjiIV482CuqMOBocsEDLa5vhWfb6Ke1NGS9RUyd70nF3gmpwA'
|
3
|
+
LENGTH = 8
|
4
|
+
|
5
|
+
def self.encode(value, message_length = nil)
|
6
|
+
message_length = LENGTH if message_length.nil?
|
7
|
+
encoder = FixedLengthEncoder::Encoder.new(ALPHABET)
|
8
|
+
encoder.encode(value, message_length)
|
14
9
|
end
|
15
10
|
|
16
11
|
def self.decode(message)
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
12
|
+
encoder = FixedLengthEncoder::Encoder.new(ALPHABET)
|
13
|
+
encoder.decode(message)
|
14
|
+
end
|
15
|
+
|
16
|
+
class Encoder
|
17
|
+
def initialize(alphabet)
|
18
|
+
@alphabet = alphabet
|
19
|
+
end
|
20
|
+
|
21
|
+
def setup(message_length)
|
22
|
+
@message_length = message_length
|
23
|
+
@max_message_value = (@alphabet.length)**message_length
|
24
|
+
@max_bits = Math::log(@max_message_value, 2).floor
|
25
|
+
@max_value = 2**@max_bits
|
26
|
+
end
|
27
|
+
|
28
|
+
def encode(value, message_length)
|
29
|
+
raise ArgumentError, 'Cannot encode a non-integer.' unless value.is_a?(Integer)
|
30
|
+
self.setup(message_length)
|
31
|
+
raise ArgumentError, "Cannot encode #{value} in #{@message_length} characters" if value > @max_value
|
32
|
+
value = self.scramble_value(value, @max_bits)
|
33
|
+
self.integer_to_string(@alphabet, value, @message_length)
|
34
|
+
end
|
35
|
+
|
36
|
+
def integer_to_string(alphabet, value, message_length)
|
37
|
+
message = ''
|
38
|
+
base = alphabet.length
|
39
|
+
while (value > 0 || message.length < message_length)
|
40
|
+
remainder = value % base
|
41
|
+
message += alphabet[remainder]
|
42
|
+
value = (value - remainder)/base
|
43
|
+
end
|
44
|
+
message
|
45
|
+
end
|
46
|
+
|
47
|
+
def decode(message)
|
48
|
+
raise ArgumentError, 'Cannot decode a non-string.' unless message.is_a?(String)
|
49
|
+
self.setup(message.length)
|
50
|
+
value = self.string_to_integer(@alphabet, message)
|
51
|
+
self.scramble_value(value, @max_bits)
|
52
|
+
end
|
53
|
+
|
54
|
+
def string_to_integer(alphabet, message)
|
55
|
+
base = alphabet.length
|
56
|
+
value = 0
|
57
|
+
message.reverse.split('').each do |digit|
|
58
|
+
index = alphabet.index(digit)
|
59
|
+
raise ArgumentError, 'Cannot decode an invalid character (' + digit + ')' if index.nil?
|
60
|
+
value = (value * base) + index
|
61
|
+
end
|
62
|
+
value
|
63
|
+
end
|
64
|
+
|
65
|
+
def scramble_value(value, bits)
|
66
|
+
binary = self.integer_to_string('10', value, bits).reverse
|
67
|
+
self.string_to_integer('01', binary)
|
22
68
|
end
|
23
|
-
value
|
24
69
|
end
|
25
70
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fixed_length_encoder
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 1.0.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,12 +9,12 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-12-
|
12
|
+
date: 2012-12-14 00:00:00.000000000 Z
|
13
13
|
dependencies: []
|
14
|
-
description: Integers are converted to
|
15
|
-
|
16
|
-
|
17
|
-
|
14
|
+
description: Integers are converted to strings using a binary reversal and a shuffled
|
15
|
+
base 62 alphabet. Strings with valid digits (0-9 a-z A-z)are converted back to
|
16
|
+
integers. The encoding is one-to-one but not sequential.This is useful for obfuscating
|
17
|
+
user ids in urls.
|
18
18
|
email: brett@paperyfrog.com
|
19
19
|
executables: []
|
20
20
|
extensions: []
|
@@ -44,5 +44,5 @@ rubyforge_project:
|
|
44
44
|
rubygems_version: 1.8.24
|
45
45
|
signing_key:
|
46
46
|
specification_version: 3
|
47
|
-
summary: Two way conversion from integer to a fixed
|
47
|
+
summary: Two way conversion from integer to a fixed (default=8) digit string.
|
48
48
|
test_files: []
|