ruby_xid 1.0.6 → 1.0.8

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 (4) hide show
  1. checksums.yaml +4 -4
  2. data/lib/ruby_xid.rb +21 -11
  3. data/lib/xid/base32.rb +32 -44
  4. metadata +3 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 57563aac1f71f9bc79cbaf1431aee6a660499b4ccab42f87570701e585017822
4
- data.tar.gz: c04e68b3bb859fdff627fbda865ab3290ba03d197eadcd11724c0e807850f8cc
3
+ metadata.gz: 5ffb58088d95b32fa0c7c20b79eeb32b76b7c16ce99f66c6c6ca390a46a2babf
4
+ data.tar.gz: 4e56a42b0066286b79cdecfd6d8a085567a2e4deca7fe70e4301747409f0dc5c
5
5
  SHA512:
6
- metadata.gz: 33d37db8dd796f96005337236f2552d5a896c390e7a92378a4cc174832ddb7cf75542627ded93d8f2e51d81f5651fc982d02adcecdae7db2fc40d0995eb440e6
7
- data.tar.gz: f64ca53e6f4b0f0ca2a43827e6c8f2c5f1b6cd0dcba94b87d2c26f1c44e040f0c63e7d8ed90e9f1cf9b96571f6e313fd93bbf12ae49c1db693ad315f13fb5311
6
+ metadata.gz: fcd15271f23fd6948e1579f7ccee1438bf830fb59a88b88070005dfc2b7876ce78f07bd0fb3b5254c33aeb482b3d5ae0f261eaffb3b62cfa2532a5aad23f77f8
7
+ data.tar.gz: acdb6523a821b1e5373bd90ce251c6fddbd93c3501fe7e9cbd682f54968efcc1023208c98509943f1f86259da98e5a374365b98549ab6a00d12a507eae82b8ef
data/lib/ruby_xid.rb CHANGED
@@ -3,6 +3,7 @@
3
3
  require 'socket'
4
4
  require 'securerandom'
5
5
  require 'date'
6
+ require 'digest'
6
7
 
7
8
  class Xid
8
9
 
@@ -12,32 +13,38 @@ class Xid
12
13
 
13
14
  def initialize(id = nil)
14
15
  @@generator ||= Generator.new(init_rand_int, real_machine_id)
15
- @value = id ? id : @@generator.generate_data.unpack('C12')
16
+ if id
17
+ # Convert array to binary string if needed
18
+ @value = id.is_a?(String) ? id : id.pack('C*')
19
+ else
20
+ @value = @@generator.generate
21
+ end
16
22
  end
17
23
 
18
24
  def next
19
25
  @string = nil
20
- @value = @@generator.generate_data.unpack('C12')
26
+ @value = @@generator.generate
21
27
  string
22
28
  end
23
29
 
24
30
  def value
25
- @value
31
+ # Return as array for backward compatibility
32
+ @value.bytes
26
33
  end
27
34
 
28
35
  def pid
29
36
  # type: () -> int
30
- (value[7] << 8 | value[8])
37
+ (@value.getbyte(7) << 8 | @value.getbyte(8))
31
38
  end
32
39
 
33
40
  def counter
34
41
  # type: () -> int
35
- value[9] << 16 | value[10] << 8 | value[11]
42
+ @value.getbyte(9) << 16 | @value.getbyte(10) << 8 | @value.getbyte(11)
36
43
  end
37
44
 
38
45
  def machine
39
46
  # type: () -> str
40
- value[4..6].map(&:chr).join('')
47
+ @value[4, 3]
41
48
  end
42
49
 
43
50
  def datetime
@@ -46,7 +53,7 @@ class Xid
46
53
 
47
54
  def time
48
55
  # type: () -> int
49
- value[0] << 24 | value[1] << 16 | value[2] << 8 | value[3]
56
+ @value.getbyte(0) << 24 | @value.getbyte(1) << 16 | @value.getbyte(2) << 8 | @value.getbyte(3)
50
57
  end
51
58
 
52
59
  def inspect
@@ -59,7 +66,7 @@ class Xid
59
66
 
60
67
  def bytes
61
68
  # type: () -> str
62
- @value.map(&:chr).join('')
69
+ @value
63
70
  end
64
71
 
65
72
  def ==(other_xid)
@@ -78,6 +85,7 @@ class Xid
78
85
  end
79
86
 
80
87
  def self.from_string(str)
88
+ raise 'Invalid Xid' if str.nil? || !str.match(/^[a-v0-9]{20}$/i)
81
89
  val = Base32.b32decode(str)
82
90
  value_check = val.select { |x| x >= 0 && x <= 255 }
83
91
 
@@ -87,13 +95,15 @@ class Xid
87
95
 
88
96
  raise 'Invalid Xid' unless value_check.all?
89
97
 
90
- Object.const_get(name).new(val)
98
+ # Convert array to binary string
99
+ binary_val = val.pack('C*')
100
+ Object.const_get(name).new(binary_val)
91
101
  end
92
102
 
93
103
  private
94
104
  def string
95
105
  # type: () -> str
96
- @string ||= Base32.b32encode(value)
106
+ @string ||= Base32.b32encode(@value)
97
107
  end
98
108
 
99
109
  def init_rand_int
@@ -119,7 +129,7 @@ class Xid
119
129
  @machine_id = machine_id
120
130
  end
121
131
 
122
- def generate_data
132
+ def generate
123
133
  # () -> str
124
134
  @mutex.synchronize do
125
135
  @rand_int += 1
data/lib/xid/base32.rb CHANGED
@@ -1,17 +1,14 @@
1
1
 
2
2
  class Xid::Base32
3
-
3
+
4
4
  # 0123456789abcdefghijklmnopqrstuv - Used for encoding
5
5
  ENCODE_HEX = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v"].freeze
6
+ DECODE_HEX_MAP = Hash[ENCODE_HEX.each_with_index.map { |x, i| [x, i] }].freeze
6
7
  TRIM_LEN = 20
7
8
 
8
9
  # Start class methods
9
10
  class << self
10
11
 
11
- def decode_hex_map
12
- Hash[ENCODE_HEX.each_with_index.map { |x, i| [x, i] }]
13
- end
14
-
15
12
  def b32encode(src)
16
13
  encode(src)
17
14
  end
@@ -20,47 +17,38 @@ class Xid::Base32
20
17
  decode(src, ENCODE_HEX)
21
18
  end
22
19
 
23
- def encode(src_str)
24
- dst = ''
25
- 3.times do |i|
26
- src_len = src_str.length
27
- next_byte = Array.new(8, 0)
28
-
29
- if src_len > 4
30
- next_byte[7] = src_str[4] & 0x1f
31
- next_byte[6] = src_str[4] >> 5
32
- end
33
- if src_len > 3
34
- next_byte[6] = next_byte[6] | (src_str[3] << 3) & 0x1f
35
- next_byte[5] = (src_str[3] >> 2) & 0x1f
36
- next_byte[4] = src_str[3] >> 7
37
- end
38
- if src_len > 2
39
- next_byte[4] = next_byte[4] | (src_str[2] << 1) & 0x1f
40
- next_byte[3] = (src_str[2] >> 4) & 0x1f
41
- end
42
- if src_len > 1
43
- next_byte[3] = next_byte[3] | (src_str[1] << 4) & 0x1f
44
- next_byte[2] = (src_str[1] >> 1) & 0x1f
45
- next_byte[1] = (src_str[1] >> 6) & 0x1f
46
- end
47
- if src_len > 0
48
- next_byte[1] = next_byte[1] | (src_str[0] << 2) & 0x1f
49
- next_byte[0] = src_str[0] >> 3
50
- end
51
-
52
- src_str = src_str[5..src_str.length]
53
- next_byte = next_byte[0..3] if i == 2
54
- next_byte.each do |nb|
55
- dst += ENCODE_HEX[nb]
56
- end
57
- end
58
-
59
- dst
20
+ def encode(id)
21
+ # Convert to byte array if binary string
22
+ id = id.bytes if id.is_a?(String)
23
+
24
+ # Build string directly instead of array + join
25
+ dst = String.new(capacity: 20)
26
+ dst << ENCODE_HEX[id[0] >> 3]
27
+ dst << ENCODE_HEX[(id[0] << 2) & 0x1f | (id[1] >> 6) & 0x1f]
28
+ dst << ENCODE_HEX[(id[1] >> 1) & 0x1f]
29
+ dst << ENCODE_HEX[(id[1] << 4) & 0x1f | (id[2] >> 4) & 0x1f]
30
+ dst << ENCODE_HEX[(id[2] << 1) & 0x1f | id[3] >> 7]
31
+ dst << ENCODE_HEX[(id[3] >> 2) & 0x1f]
32
+ dst << ENCODE_HEX[(id[3] << 3) & 0x1f | id[4] >> 5]
33
+ dst << ENCODE_HEX[id[4] & 0x1f]
34
+ dst << ENCODE_HEX[id[5] >> 3]
35
+ dst << ENCODE_HEX[(id[5] << 2) & 0x1f | (id[6] >> 6) & 0x1f]
36
+ dst << ENCODE_HEX[(id[6] >> 1) & 0x1f]
37
+ dst << ENCODE_HEX[(id[6] << 4) & 0x1f | (id[7] >> 4) & 0x1f]
38
+ dst << ENCODE_HEX[(id[7] << 1) & 0x1f | id[8] >> 7]
39
+ dst << ENCODE_HEX[(id[8] >> 2) & 0x1f]
40
+ dst << ENCODE_HEX[(id[8] << 3) & 0x1f | (id[9] >> 5)]
41
+ dst << ENCODE_HEX[id[9] & 0x1f]
42
+ dst << ENCODE_HEX[id[10] >> 3]
43
+ dst << ENCODE_HEX[(id[10] << 2) & 0x1f | (id[11] >> 6) & 0x1f]
44
+ dst << ENCODE_HEX[(id[11] >> 1) & 0x1f]
45
+ dst << ENCODE_HEX[(id[11] << 4) & 0x1f]
46
+
47
+ dst.freeze
60
48
  end
61
49
 
62
50
  def decode(src, str_map)
63
- src.downcase!
51
+ src = src.downcase
64
52
 
65
53
  end_loop = false
66
54
  result = []
@@ -76,7 +64,7 @@ class Xid::Base32
76
64
  break
77
65
  end
78
66
  char = src[i]
79
- dbuf[i] = decode_hex_map[char]
67
+ dbuf[i] = DECODE_HEX_MAP[char]
80
68
  end
81
69
 
82
70
  if src_len >= 8
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruby_xid
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.6
4
+ version: 1.0.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Valarpiraichandran
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-12-17 00:00:00.000000000 Z
11
+ date: 2026-02-23 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description:
14
14
  email: a.valarpirai@gmail.com
@@ -37,7 +37,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
37
37
  - !ruby/object:Gem::Version
38
38
  version: '0'
39
39
  requirements: []
40
- rubygems_version: 3.0.6
40
+ rubygems_version: 3.0.3.1
41
41
  signing_key:
42
42
  specification_version: 4
43
43
  summary: Ruby xid implementation