Sha256: b1383269b0fc2971f93a7198fac0f053edc8cb0eb2e6d5e4c59fc53028e1722f

Contents?: true

Size: 921 Bytes

Versions: 2

Compression:

Stored size: 921 Bytes

Contents

# frozen_string_literal: true

class ActiveUxid::Hash < ActiveUxid::Base

  def initialize(id)
    @id = id
    super()
  end

  def self.encode(id)
    klass = new(id)
    klass.encode_uxid
  end

  def self.decode(id)
    klass = new(id)
    klass.decode_uxid
  end

  def encode_uxid
    uxid_encode_chars((@id + encoding_salt) << encoding_length)
  end

  def decode_uxid
    (uxid_decode_chars(@id) >> encoding_length) - encoding_salt
  end

  def uxid_encode_chars(id)
    return '0' if id.zero?
    return nil if id.negative?

    str = ''

    while id.positive?
      str = "#{encoding_chars[id % encoding_base]}#{str}"
      id /= encoding_base
    end

    str
  end

  def uxid_decode_chars(id)
    pos = 0
    num = 0
    len = id.length
    max = len - 1

    while pos < len
      pow = encoding_base**(max - pos)
      num += encoding_chars.index(id[pos]) * pow
      pos += 1
    end

    num
  end

end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
active_uxid-5.1.0 lib/active_uxid/hash.rb
active_uxid-5.0.2 lib/active_uxid/hash.rb