3v4l.org

run code in 500+ PHP versions simultaneously
<?php $serverSeed = 'e78c228314facf55690f0d2cbbfec52e1c4576d82ef57e31c0c0054590f8b78d'; $serverSeedHash = '997a9ff96cbca4eab99d38895c32e9c030b031c33ecc1d507467a7640a4f46d5'; $clientSeed = 'f683e8c90dd7207618efb578f0ac98f8'; $nonce = 89; $chance = '0.57520129'; $reportedRoll = '3436792651121867'; $reportedResult = 'LOST'; $digest = hash_hmac('sha256', $clientSeed . ':' . $nonce, $serverSeed); $roll = hexdec(substr($digest, 0, 13)); $rollText = sprintf('%.0f', $roll); $scale = 100000000; $space = 2 ** 52; [$whole, $fraction] = array_pad(explode('.', $chance, 2), 2, ''); // Exact here: every integer intermediate stays below PHP float's 53-bit limit. $probability = (float) $whole * $scale + (float) str_pad(substr($fraction, 0, 8), 8, '0'); $wholeSteps = floor($space / $scale); $threshold = $probability * $wholeSteps + floor($probability * ($space - $wholeSteps * $scale) / $scale); $result = $roll < $threshold ? 'WON' : 'LOST'; $check = fn(bool $ok) => $ok ? 'OK' : 'MISMATCH'; echo 'Hash: ' . $check(hash('sha256', $serverSeed) === strtolower($serverSeedHash)) . PHP_EOL; echo "Roll: $rollText / $reportedRoll — " . $check($rollText === $reportedRoll) . PHP_EOL; echo "Result: $result / $reportedResult — " . $check($result === $reportedResult);

preferences:
23.64 ms | 484 KiB | 4 Q