class Onliest
It uses the method described by Zack Bloom (eager.io/blog/how-long-does-an-id-need-to-be/).
Constants
- DEFAULT_RNG
- RANDOM_BITMASK
- RANDOM_BITS
- TIME_BITMASK
- TIME_BITS
Public Class Methods
new(rng: DEFAULT_RNG, fields: false)
click to toggle source
Create a new unique value generator. rng
defaults to SecureRandom
. An object that implements :random_number
returning a random integer >= 0 and less than value provided as the first argument.
# File lib/onliest.rb, line 27 def initialize(rng: DEFAULT_RNG, fields: false) @fields = fields ? fields : default_fields(rng) end
value()
click to toggle source
Return a new unique value, using the default random number generator
# File lib/onliest.rb, line 19 def self.value new.value end
Public Instance Methods
value()
click to toggle source
Construct and return the unique value
# File lib/onliest.rb, line 32 def value total_bits = 0 total_value = 0 @fields.reverse.each do |field| bits = field.fetch(:bits) field_value = Integer(field.fetch(:generator).call) & ((2**bits) - 1) total_value += (field_value << total_bits) total_bits += bits end total_value end
Private Instance Methods
default_fields(rng)
click to toggle source
# File lib/onliest.rb, line 46 def default_fields(rng) [{ bits: TIME_BITS, generator: -> { Time.now.to_i } }, { bits: RANDOM_BITS, generator: -> { rng.random_number(RANDOM_BITMASK + 1) } }] end