class Hackle::Bucketer

Public Instance Methods

bucketing(bucket:, user:) click to toggle source

@param bucket [Bucket] @param user [User]

@return [Slot, nil]

# File lib/hackle/decision/bucketer.rb, line 12
def bucketing(bucket:, user:)
  slot_number = calculate_slot_number(
    seed: bucket.seed,
    slot_size: bucket.slot_size,
    user_id: user.id
  )
  bucket.get_slot(slot_number: slot_number)
end
calculate_slot_number(seed:, slot_size:, user_id:) click to toggle source

@param seed [Integer] @param slot_size [Integer] @param user_id [String]

@return [Integer]

# File lib/hackle/decision/bucketer.rb, line 26
def calculate_slot_number(seed:, slot_size:, user_id:)
  hash_value = hash(data: user_id, seed: seed)
  hash_value.abs % slot_size
end
hash(data:, seed:) click to toggle source

@param data [String] @param seed [Integer]

@return [Integer]

# File lib/hackle/decision/bucketer.rb, line 35
def hash(data:, seed:)
  unsigned_value = MurmurHash3::V32.str_hash(data, seed)
  if (unsigned_value & 0x80000000).zero?
    unsigned_value
  else
    -((unsigned_value ^ 0xFFFFFFFF) + 1)
  end
end