Sha256: 2099385c5df049cad14bd72825ce1b05dd2de9641f2d0397481fc21968d41bdf

Contents?: true

Size: 782 Bytes

Versions: 1

Compression:

Stored size: 782 Bytes

Contents

# frozen_string_literal: true

module Lite
  module Uxid
    class Nanoid < Base::Irreversible

      def encode
        uxid = +""

        loop do
          cached_bytes = bytes

          (0...step).each do |idx|
            byte = cached_bytes[idx] & mask
            char = byte && coder_charset[byte]
            next unless char

            uxid << char
            return uxid if uxid.size == coder_size
          end
        end

        "#{coder_prefix}#{uxid}"
      end

      private

      def bytes
        SecureRandom.random_bytes(coder_size).bytes
      end

      def mask
        @mask ||= (2 << (Math.log(coder_length - 1) / Math.log(2))) - 1
      end

      def step
        @step = (1.6 * mask * coder_size / coder_length).ceil
      end

    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
lite-uxid-1.5.2 lib/lite/uxid/nanoid.rb