class ABSplit::Functions::Md5WeightedSplit

Weighted split based on MD5 digest of value.

Persistent - Collisions are possible

Supports 128 bits as input

Constants

MAX_HASH_VALUE

Protected Class Methods

calculate_markers(experiments) click to toggle source
# File lib/a_b_split/functions/md5_weighted_split.rb, line 36
def calculate_markers(experiments)
  cumulative = 0
  experiments.map do |experiment|
    cumulative += experiment['weight']
    { marker: cumulative }.merge(experiment)
  end
end
hash(value) click to toggle source
# File lib/a_b_split/functions/md5_weighted_split.rb, line 32
def hash(value)
  Digest::MD5.hexdigest(value.to_s).to_i(16)
end
select_experiment_for(value, experiments) click to toggle source
# File lib/a_b_split/functions/md5_weighted_split.rb, line 19
def select_experiment_for(value, experiments)
  weight = weight(value)
  experiments = calculate_markers experiments
  experiments.each do |experiment|
    return experiment['name'] if weight <= experiment[:marker]
  end
  experiments.last['name']
end
weight(value) click to toggle source
# File lib/a_b_split/functions/md5_weighted_split.rb, line 28
def weight(value)
  100 * hash(value).to_f / MAX_HASH_VALUE
end