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.
Files changed (2) hide show
  1. data/lib/fixed_length_encoder.rb +64 -19
  2. metadata +7 -7
@@ -1,25 +1,70 @@
1
- class FixedLengthEncoder
2
- ALPHABET = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
3
- BASE = ALPHABET.length
4
-
5
- def self.encode(value, length = 8)
6
- raise ArgumentError, 'Cannot encode a non-Integer.' unless value.is_a?(Integer)
7
- message = ''
8
- while (value > 0)
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
- value = 0
18
- message.reverse.split('').each do |digit|
19
- index = ALPHABET.index(digit)
20
- raise ArgumentError, 'Invalid character' if index.nil?
21
- value = (value * BASE) + index
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.1
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-13 00:00:00.000000000 Z
12
+ date: 2012-12-14 00:00:00.000000000 Z
13
13
  dependencies: []
14
- description: Integers are converted to 6 or 8 digit strings using a binary reversal
15
- and a shuffled base 62 alphabet. Strings with valid digits (0-9 a-z A-z)are converted
16
- back to integers. The encoding is one-to-one but not sequential.This is useful
17
- for obfuscating user ids in urls.
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 6 or 8 digit string.
47
+ summary: Two way conversion from integer to a fixed (default=8) digit string.
48
48
  test_files: []