From 52e2a11049330705585169b06b6d36d1d844bb63 Mon Sep 17 00:00:00 2001 From: Maarten Date: Mon, 18 May 2026 12:41:39 +0200 Subject: [PATCH 1/5] More random, more better --- src/AbService.php | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/AbService.php b/src/AbService.php index 06d3879..2d6d406 100644 --- a/src/AbService.php +++ b/src/AbService.php @@ -109,10 +109,10 @@ public function getVariant(string $experiment): string public function getHash(string $uid, string $experiment): float { - $hex = substr(hash('sha256', $uid . $experiment), 0, 16); + $hex = substr(hash('sha256', $uid . $experiment), 0, 15); $int = hexdec($hex); - return $int / 0xFFFFFFFFFFFFFFFF; + return $int / 2**60; } public function chooseVariant(float $hash, array $variants): string @@ -122,8 +122,9 @@ public function chooseVariant(float $hash, array $variants): string $names = array_keys($variants); $weights = array_values($variants); + $nameCount = count($names); - for ($i = 0; $i < count($names) -1; $i++) { + for ($i = 0; $i < $nameCount -1; $i++) { $sum += $weights[$i]; if ($hash < $sum) { From 6c25df906a2d1d675c8272b780e67a4b18d52496 Mon Sep 17 00:00:00 2001 From: Maarten Date: Mon, 18 May 2026 15:49:14 +0200 Subject: [PATCH 2/5] dan zo --- src/AbService.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/AbService.php b/src/AbService.php index 2d6d406..18f393d 100644 --- a/src/AbService.php +++ b/src/AbService.php @@ -112,7 +112,7 @@ public function getHash(string $uid, string $experiment): float $hex = substr(hash('sha256', $uid . $experiment), 0, 15); $int = hexdec($hex); - return $int / 2**60; + return $int / 2**60-1; } public function chooseVariant(float $hash, array $variants): string @@ -127,7 +127,7 @@ public function chooseVariant(float $hash, array $variants): string for ($i = 0; $i < $nameCount -1; $i++) { $sum += $weights[$i]; - if ($hash < $sum) { + if ($hash <= $sum) { $variant = $names[$i]; break; } From da18bc48eb8357484007e41a88ad40ba16f24332 Mon Sep 17 00:00:00 2001 From: Maarten Date: Mon, 18 May 2026 15:52:38 +0200 Subject: [PATCH 3/5] BAM --- src/AbService.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/AbService.php b/src/AbService.php index 18f393d..2d6d406 100644 --- a/src/AbService.php +++ b/src/AbService.php @@ -112,7 +112,7 @@ public function getHash(string $uid, string $experiment): float $hex = substr(hash('sha256', $uid . $experiment), 0, 15); $int = hexdec($hex); - return $int / 2**60-1; + return $int / 2**60; } public function chooseVariant(float $hash, array $variants): string @@ -127,7 +127,7 @@ public function chooseVariant(float $hash, array $variants): string for ($i = 0; $i < $nameCount -1; $i++) { $sum += $weights[$i]; - if ($hash <= $sum) { + if ($hash < $sum) { $variant = $names[$i]; break; } From c0d36feaedecbe3cc598e42be77504d52f5e8806 Mon Sep 17 00:00:00 2001 From: Maarten Date: Mon, 18 May 2026 15:55:34 +0200 Subject: [PATCH 4/5] x --- src/AbService.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/AbService.php b/src/AbService.php index 2d6d406..84a82b9 100644 --- a/src/AbService.php +++ b/src/AbService.php @@ -112,7 +112,7 @@ public function getHash(string $uid, string $experiment): float $hex = substr(hash('sha256', $uid . $experiment), 0, 15); $int = hexdec($hex); - return $int / 2**60; + return $int / 2 ** 60; } public function chooseVariant(float $hash, array $variants): string From 93ca0231c784c79825466053816fe1869056330f Mon Sep 17 00:00:00 2001 From: Maarten Date: Mon, 18 May 2026 15:59:31 +0200 Subject: [PATCH 5/5] phpcs --- src/AbService.php | 2 +- test/AbServiceTest.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/AbService.php b/src/AbService.php index 84a82b9..633c011 100644 --- a/src/AbService.php +++ b/src/AbService.php @@ -124,7 +124,7 @@ public function chooseVariant(float $hash, array $variants): string $weights = array_values($variants); $nameCount = count($names); - for ($i = 0; $i < $nameCount -1; $i++) { + for ($i = 0; $i < $nameCount - 1; $i++) { $sum += $weights[$i]; if ($hash < $sum) { diff --git a/test/AbServiceTest.php b/test/AbServiceTest.php index ea08883..52bd2a8 100644 --- a/test/AbServiceTest.php +++ b/test/AbServiceTest.php @@ -96,7 +96,7 @@ public function testGetVariant(): void public function testGetVariantDistributed(): void { $this->markTestSkipped("takes a while"); - + $iterations = 1000000; $delta = $iterations / 500; // 0.2% difference