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