Module: Mixpanel::Flags::Utils

Defined in:
lib/mixpanel-ruby/flags/utils.rb

Constant Summary collapse

EXPOSURE_EVENT =
'$experiment_started'.freeze

Class Method Summary collapse

Class Method Details

.fnv1a_64(data) ⇒ Integer

FNV-1a 64-bit hash implementation Used for consistent variant assignment

Parameters:

  • data (String)

    Data to hash

Returns:

  • (Integer)

    64-bit hash value



13
14
15
16
17
18
19
20
21
22
23
24
# File 'lib/mixpanel-ruby/flags/utils.rb', line 13

def self.fnv1a_64(data)
  fnv_prime = 0x100000001b3
  hash_value = 0xcbf29ce484222325

  data.bytes.each do |byte|
    hash_value ^= byte
    hash_value *= fnv_prime
    hash_value &= 0xffffffffffffffff  # Keep 64-bit
  end

  hash_value
end

.generate_traceparentString

Generate W3C traceparent header for distributed tracing Format: 00-trace-id-parent-id-trace-flags

Returns:

  • (String)

    traceparent header value



55
56
57
58
59
60
61
62
# File 'lib/mixpanel-ruby/flags/utils.rb', line 55

def self.generate_traceparent
  version = '00'
  trace_id = SecureRandom.hex(16)
  parent_id = SecureRandom.hex(8)
  trace_flags = '01'  # sampled

  "#{version}-#{trace_id}-#{parent_id}-#{trace_flags}"
end

.normalized_hash(key, salt) ⇒ Float

Normalized hash for variant assignment Returns a float in the range [0.0, 1.0) for rollout percentage matching

Parameters:

  • key (String)

    Key to hash (typically distinct_id)

  • salt (String)

    Salt value (flag-specific)

Returns:

  • (Float)

    Value between 0.0 and 1.0 (non-inclusive upper bound)



32
33
34
35
36
# File 'lib/mixpanel-ruby/flags/utils.rb', line 32

def self.normalized_hash(key, salt)
  combined = key.to_s + salt.to_s
  hash_value = fnv1a_64(combined)
  (hash_value % 100) / 100.0
end

.prepare_common_query_params(token, lib_version) ⇒ Hash

Prepare common query parameters for flags API

Parameters:

  • token (String)

    Mixpanel project token

  • $lib_version (String)

    SDK version

Returns:

  • (Hash)

    Query parameters



43
44
45
46
47
48
49
# File 'lib/mixpanel-ruby/flags/utils.rb', line 43

def self.prepare_common_query_params(token, lib_version)
  {
    'mp_lib' => 'ruby',
    '$lib_version' => lib_version,
    'token' => token
  }
end