uxid 0.1.0 → 0.2.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +7 -0
- data/Gemfile.lock +1 -1
- data/README.md +7 -5
- data/lib/uxid.rb +37 -1
- data/lib/uxid/encoder.rb +1 -12
- data/lib/uxid/model.rb +2 -2
- data/lib/uxid/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 307443b03ac5b5b09a4d9f9da47fb1fe49c0756a003686e4dc91befd7826b46f
|
4
|
+
data.tar.gz: 4ccd6a17d53a456c353c4e3d227c8d49e5d3d46f41a5cf07ecd7de4b8c29da81
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 80f7234fa2c8497a2c5077b4a267ce9cfc2bbe9638891a539ec9471e63570a6be128cf26289a2453b8f5fd8555cee779bc1fb65737f100b4b7bb75585469ba35
|
7
|
+
data.tar.gz: 8ec73e770fed7334cbe650143032286a635ecabd8861417bc12b3340639b162aa23cc544cb980ebb825b1cb2ca6c9b5b4279a5e95ce992fb3955f1c4c1beb65d
|
data/CHANGELOG.md
CHANGED
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -3,17 +3,18 @@
|
|
3
3
|
![MIT License][badge_license_url]
|
4
4
|
![Gem Version][badge_version_url]
|
5
5
|
|
6
|
-
|
6
|
+
|
7
|
+
**U**ser e**X**perience focused **ID**entifiers (UXIDs) are identifiers which:
|
7
8
|
|
8
9
|
* Describe the resource (aid in debugging and investigation)
|
9
|
-
* Prononounceable - easily and accurately transmit characters to another human using a telephone
|
10
10
|
* Work well with copy and paste (double clicking selects the entire ID)
|
11
11
|
* Can be shortened for low cardinality resources
|
12
|
-
* Are very unlikely to collide (more likely with less randomness)
|
13
12
|
* Are secure against enumeration attacks
|
14
13
|
* Can be generated by application code (not tied to the datastore)
|
15
14
|
* Are K-sortable (lexicographically sortable by time - works well with datastore indexing)
|
16
15
|
* Do not require any coordination (human or automated) at startup, or generation
|
16
|
+
* Are very unlikely to collide (more likely with less randomness)
|
17
|
+
* Are easily and accurately transmitted to another human using a telephone
|
17
18
|
|
18
19
|
Many of the concepts of Stripe IDs have been used in this library.
|
19
20
|
|
@@ -29,7 +30,8 @@ UXID.generate # "01EMDGJF0DQXQJ8FM78XE97Y3H"
|
|
29
30
|
UXID.generate prefix: "cus" # "cus_01EMDGJF0DQXQJ8FM78XE97Y3H"
|
30
31
|
|
31
32
|
# The amount of entropy can be decreased for smaller cardinality resources
|
32
|
-
|
33
|
+
# T-Shirt sizes can be used (:xs, :s, :m, :l, :xl) or (:xsmall, :small, :medium, :large, :xlarge)
|
34
|
+
UXID.generate prefix: "cus", size: :small # "cus_01EQRH884AQYY1"
|
33
35
|
```
|
34
36
|
|
35
37
|
|
@@ -38,7 +40,7 @@ UXID.generate prefix: "cus", size: 4 # "cus_01EMDGN5QAGPWSKN2"
|
|
38
40
|
Add this line to your application's Gemfile:
|
39
41
|
|
40
42
|
```ruby
|
41
|
-
gem
|
43
|
+
gem "uxid"
|
42
44
|
```
|
43
45
|
|
44
46
|
And then execute:
|
data/lib/uxid.rb
CHANGED
@@ -14,6 +14,12 @@ module UXID
|
|
14
14
|
CROCKFORD_ENCODING = "0123456789ABCDEFGHJKMNPQRSTVWXYZ"
|
15
15
|
DELIMITER = "_"
|
16
16
|
|
17
|
+
SIZE_WARNING_MESSAGE = <<-EOM
|
18
|
+
WARN: The UXID :size param is for Symbol T-Shirt sizes only.
|
19
|
+
Please use the :size param with Symbols (:xs, :s, :m, :l, :xl, or :xsmall, :small, :medium, :large, :xlarge),
|
20
|
+
or use the :rand_size param for specific size of random bytes.
|
21
|
+
EOM
|
22
|
+
|
17
23
|
class Error < StandardError; end
|
18
24
|
|
19
25
|
def self.generate attrs = {}
|
@@ -25,9 +31,39 @@ module UXID
|
|
25
31
|
model = ::UXID::Model.new
|
26
32
|
|
27
33
|
model.time = attrs[:time] || Time.now
|
28
|
-
model.size = attrs[:size] || 10
|
29
34
|
model.prefix = attrs[:prefix] || ""
|
30
35
|
|
36
|
+
if attrs[:rand_size]
|
37
|
+
model.rand_size = attrs[:rand_size]
|
38
|
+
else
|
39
|
+
model.size = attrs[:size]
|
40
|
+
case model.size
|
41
|
+
when Integer
|
42
|
+
puts SIZE_WARNING_MESSAGE
|
43
|
+
model.rand_size = model.size
|
44
|
+
|
45
|
+
when String
|
46
|
+
puts SIZE_WARNING_MESSAGE
|
47
|
+
model.rand_size = 10
|
48
|
+
|
49
|
+
when :xs, :xsmall
|
50
|
+
model.rand_size = 0
|
51
|
+
|
52
|
+
when :s, :small
|
53
|
+
model.rand_size = 2
|
54
|
+
|
55
|
+
when :m, :medium
|
56
|
+
model.rand_size = 5
|
57
|
+
|
58
|
+
when :l, :large
|
59
|
+
model.rand_size = 7
|
60
|
+
|
61
|
+
else
|
62
|
+
model.rand_size = 10
|
63
|
+
end
|
64
|
+
|
65
|
+
end
|
66
|
+
|
31
67
|
model
|
32
68
|
end
|
33
69
|
end
|
data/lib/uxid/encoder.rb
CHANGED
@@ -10,7 +10,7 @@ module UXID
|
|
10
10
|
|
11
11
|
def encode
|
12
12
|
@model.time_encoded = encode_time
|
13
|
-
@model.entropy_encoded = public_send "encode_entropy_#{@model.
|
13
|
+
@model.entropy_encoded = public_send "encode_entropy_#{@model.rand_size}"
|
14
14
|
|
15
15
|
@model.encoded
|
16
16
|
end
|
@@ -35,17 +35,6 @@ module UXID
|
|
35
35
|
UXID::CROCKFORD_ENCODING[((b1&1)<<4)]
|
36
36
|
end
|
37
37
|
|
38
|
-
def encode_entropy_2
|
39
|
-
b0, b1 = @model.entropy_bytes
|
40
|
-
|
41
|
-
UXID::CROCKFORD_ENCODING[(b0&248)>>3] +
|
42
|
-
UXID::CROCKFORD_ENCODING[((b0&7)<<2)] +
|
43
|
-
UXID::CROCKFORD_ENCODING[(b0&248)>>3] +
|
44
|
-
UXID::CROCKFORD_ENCODING[((b0&7)<<2) | ((b1&192)>>6)] +
|
45
|
-
UXID::CROCKFORD_ENCODING[(b1&62)>>1] +
|
46
|
-
UXID::CROCKFORD_ENCODING[((b1&1)<<4)]
|
47
|
-
end
|
48
|
-
|
49
38
|
def encode_entropy_3
|
50
39
|
b0, b1, b2 = @model.entropy_bytes
|
51
40
|
|
data/lib/uxid/model.rb
CHANGED
@@ -2,7 +2,7 @@ require "uxid/encoder"
|
|
2
2
|
|
3
3
|
module UXID
|
4
4
|
class Model
|
5
|
-
attr_accessor :time, :time_encoded, :entropy, :entropy_encoded, :prefix, :size
|
5
|
+
attr_accessor :time, :time_encoded, :entropy, :entropy_encoded, :prefix, :size, :rand_size
|
6
6
|
|
7
7
|
def encode
|
8
8
|
encoder = ::UXID::Encoder.new self
|
@@ -22,7 +22,7 @@ module UXID
|
|
22
22
|
def entropy_bytes
|
23
23
|
return @entropy_bytes if @entropy_bytes
|
24
24
|
|
25
|
-
bytes_string = SecureRandom.random_bytes @
|
25
|
+
bytes_string = SecureRandom.random_bytes @rand_size
|
26
26
|
@entropy_bytes = bytes_string.bytes
|
27
27
|
return @entropy_bytes
|
28
28
|
end
|
data/lib/uxid/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: uxid
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- JohnnyT
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-11-
|
11
|
+
date: 2020-11-24 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: 'Generates IDs like: cus_01EPEY1JMKXVBT and txn_01EPEY2P06TR1RTV07XA82ZGJJ
|
14
14
|
(similar to Stripe identifiers).'
|