onliest 0.0.2

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 231435f376731f8c8e9ea57de9c5fa72c93584f6
4
+ data.tar.gz: fae174999ac03c89d9847efc9f26687cd1b9336a
5
+ SHA512:
6
+ metadata.gz: 75b616b372f8431dbbebd7395fefb3c0ab8737672568f931585cb25e0d2ff7973d23ccd1cfb5d8610a9868bb80d107dc197d5a756d8a95189ab1784aee0c7b9d
7
+ data.tar.gz: 7a55e1ee34960ce44e98dc0ce63c00a9cfd03462dd8b96b9c68ad1de3dede8da9619c6392acd92fd2d88a5eeaa11e4251826d032bb7acf0f09a08ccc018e6ffa
checksums.yaml.gz.sig ADDED
Binary file
data/bin/onliest ADDED
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'onliest'
4
+
5
+ puts Onliest.value
data/lib/onliest.rb ADDED
@@ -0,0 +1,46 @@
1
+ require 'securerandom'
2
+
3
+ # Onliest generates unique numbers for use as database keys in
4
+ # distributed applications. The values are composed of the rightmost
5
+ # 25 bits of a POSIX timestamp and 47 random bits.
6
+
7
+ # It uses the method described by Zack Bloom
8
+ # (https://eager.io/blog/how-long-does-an-id-need-to-be/).
9
+ class Onliest
10
+ RANDOM_BITS = 47
11
+ TIME_BITS = 25
12
+ RANDOM_BITMASK = (2**RANDOM_BITS) - 1
13
+ TIME_BITMASK = (2**TIME_BITS) - 1
14
+
15
+ DEFAULT_RNG = SecureRandom
16
+
17
+ # Return a new unique value, using the default random number
18
+ # generator
19
+ def self.value
20
+ new.value
21
+ end
22
+
23
+ # Create a new unique value generator. +rng+ defaults to
24
+ # +SecureRandom+. An object that implements +:random_number+
25
+ # returning a random integer >= 0 and less than value provided as
26
+ # the first argument.
27
+ def initialize(rng = DEFAULT_RNG)
28
+ @rng = rng
29
+ end
30
+
31
+ # Return the unique 72-bit value
32
+ def value
33
+ (some_time_bits << RANDOM_BITS) +
34
+ some_random_bits
35
+ end
36
+
37
+ private
38
+
39
+ def some_random_bits
40
+ @rng.random_number(RANDOM_BITMASK + 1)
41
+ end
42
+
43
+ def some_time_bits
44
+ Time.now.to_i & TIME_BITMASK
45
+ end
46
+ end
@@ -0,0 +1,46 @@
1
+ require 'minitest/autorun'
2
+
3
+ require 'onliest'
4
+
5
+ class OnliestTest < Minitest::Unit::TestCase
6
+ def test_generates_a_number
7
+ assert_kind_of(Integer, Onliest.value)
8
+ end
9
+
10
+ def test_values_are_different
11
+ refute_equal(Onliest.value, Onliest.value)
12
+ end
13
+
14
+ def fake_prng(value = 1)
15
+ fake_prng = Minitest::Mock.new
16
+ fake_prng.expect(:random_number, value, [2**47])
17
+ end
18
+
19
+ def at(value)
20
+ Time.stub(:now, Time.at(value)) do
21
+ yield
22
+ end
23
+ end
24
+
25
+ def test_with_a_time_and_a_prng
26
+ at((2**25) + 1) do
27
+ random_value = 2
28
+ gen = Onliest.new(fake_prng(random_value))
29
+ assert_equal(gen.value, (1 << 47) + random_value)
30
+ end
31
+ end
32
+
33
+ def test_the_littlest_onliest
34
+ at(0) do
35
+ gen = Onliest.new(fake_prng(0))
36
+ assert_equal(gen.value, 0)
37
+ end
38
+ end
39
+
40
+ def test_the_largest_onliest
41
+ at(2**25 - 1) do
42
+ gen = Onliest.new(fake_prng(2**47 - 1))
43
+ assert_equal(gen.value, 2**72 - 1)
44
+ end
45
+ end
46
+ end
data.tar.gz.sig ADDED
@@ -0,0 +1,4 @@
1
+ ����o�����0�%�.��I ���?�Ү}7��
2
+ �<胧�H�8�;{�,p䰰N�s��k�?���L���A_6��>����6"���+]��۸����w�#�� �s$=��_ܪRNj8�M)���`O��
3
+ 
4
+ ������j�B�R\i$���vG�Ŀ�1�hL P�Ys}�*��{�|���F�Rv`�h�U�11D��6e�s%�r��U�9η�o��.�0f m�J��P��/�0�oQ��$�
metadata ADDED
@@ -0,0 +1,71 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: onliest
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.2
5
+ platform: ruby
6
+ authors:
7
+ - Robert Church
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain:
11
+ - |
12
+ -----BEGIN CERTIFICATE-----
13
+ MIIDaDCCAlCgAwIBAgIBATANBgkqhkiG9w0BAQUFADA9MQ8wDQYDVQQDDAZjaHJj
14
+ aHIxFTATBgoJkiaJk/IsZAEZFgVnbWFpbDETMBEGCgmSJomT8ixkARkWA2NvbTAe
15
+ Fw0xNDExMTcwMzU0NDZaFw0xNTExMTcwMzU0NDZaMD0xDzANBgNVBAMMBmNocmNo
16
+ cjEVMBMGCgmSJomT8ixkARkWBWdtYWlsMRMwEQYKCZImiZPyLGQBGRYDY29tMIIB
17
+ IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxYcGTCEi6hbbKJf8NtH1UIGg
18
+ OFlMQjzp/QgN4IQV8wJbePzkm9Zfy0I19u/0Q+WmepkpwGLwEb84yiInpHpYKhVW
19
+ 7MQOekiS+JxfGgXfAUtUZLLeeCe+R5IO9mZx+8PmA+S/WWaZngGuJE9vAi0Cobr7
20
+ dKpsSeavB/mkE0V0jGnaUc6rJeO8sB/nzOeJ9OqxgUUI4698POpGLknhq9of//Yx
21
+ 51WwQul6sItx/AELZKEM/Zuu+nvMCYFU0oM0OHMYaN5EDERjLGVXAYBTyKuUq0js
22
+ kAydz6hfkrTBw8Aa/2s7w12EFq5jTBPS8fhvTFdGbveoF8HZuYV0PNEnSbhRpQID
23
+ AQABo3MwcTAJBgNVHRMEAjAAMAsGA1UdDwQEAwIEsDAdBgNVHQ4EFgQUQT0zqrtG
24
+ cFXJ2o4qWOe8Rq2FsEEwGwYDVR0RBBQwEoEQY2hyY2hyQGdtYWlsLmNvbTAbBgNV
25
+ HRIEFDASgRBjaHJjaHJAZ21haWwuY29tMA0GCSqGSIb3DQEBBQUAA4IBAQBRdlDl
26
+ dXzKVcuK/w1EwgfPlI3BVMbSBGx9evofmH8pSWOV7Pqu3ZU9u91SGzMtMULVj+03
27
+ SJRx2pS3sVfzTt+jPfIqQk37rfc9iYLPCwM5G5RypT3iAIM/V/rJv5+z9lYwE/76
28
+ 8ZrYVUK9zx91u/xkFseEig5ZqCCZIiBGKleos2uruy+eG5On1w5ShGqIaoxQvCa0
29
+ W6y4KVKgJJKunt/R+DNGrFnPFkd+gzWOyinOhQoVeHvyhslkA+ptgJSk2Q/KwTXO
30
+ 3TLzfUddZ0/HMBNYO9OALcF70YnWb/usnr4lwVfhbJ+fcejAsp5Seurmhw7FeMoZ
31
+ f4Rtc1iUIHYWfDpz
32
+ -----END CERTIFICATE-----
33
+ date: 2014-11-15 00:00:00.000000000 Z
34
+ dependencies: []
35
+ description: Generate unique values with numeric locality.
36
+ email: chrchr@gmail.com
37
+ executables:
38
+ - onliest
39
+ extensions: []
40
+ extra_rdoc_files: []
41
+ files:
42
+ - lib/onliest.rb
43
+ - bin/onliest
44
+ - test/test_onliest.rb
45
+ homepage: https://github.com/chrchr/onliest
46
+ licenses:
47
+ - MIT
48
+ metadata: {}
49
+ post_install_message:
50
+ rdoc_options: []
51
+ require_paths:
52
+ - lib
53
+ required_ruby_version: !ruby/object:Gem::Requirement
54
+ requirements:
55
+ - - '>='
56
+ - !ruby/object:Gem::Version
57
+ version: '0'
58
+ required_rubygems_version: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - '>='
61
+ - !ruby/object:Gem::Version
62
+ version: '0'
63
+ requirements: []
64
+ rubyforge_project:
65
+ rubygems_version: 2.0.14
66
+ signing_key:
67
+ specification_version: 4
68
+ summary: 'Onliest: generate unique values with numeric locality'
69
+ test_files:
70
+ - test/test_onliest.rb
71
+ has_rdoc:
metadata.gz.sig ADDED
@@ -0,0 +1,2 @@
1
+ U�`@
2
+ hг*��Fs>��