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