3v4l.org

run code in 500+ PHP versions simultaneously
<?php $serverSeed = getenv('PF_SERVER_SEED') ?: '...'; // 32 hex $serverSalt = getenv('PF_SERVER_SALT') ?: '...'; // 16 hex $publicHash = getenv('PF_PUBLIC_HASH') ?: '...'; // 64 hex $clientSeed = getenv('PF_CLIENT_SEED') ?: '...'; $nonce = (int) (getenv('PF_NONCE') ?: 0); $maxRoll = (int) (getenv('PF_MAX_ROLL') ?: 100000); $expectedRoll = getenv('PF_EXPECTED_ROLL') !== false ? (int) getenv('PF_EXPECTED_ROLL') : null; // ─────────────────────────────────────────────────────────────────────────── $roll = (hexdec(substr(hash_hmac('sha512', $serverSeed, "$clientSeed-$nonce"), 0, 15)) % $maxRoll) + 1; $hashOk = hash_equals($publicHash, hash_hmac('sha256', $serverSeed, $serverSalt)); printf("public hash matches: %s\n", $hashOk ? 'YES' : 'NO'); printf("roll: %d (full 1..%d)\n", $roll, $maxRoll); if ($expectedRoll !== null) { printf("matches API roll (%d): %s\n", $expectedRoll, $roll === $expectedRoll ? 'YES' : 'NO'); }
Output for 8.2.31 - 8.2.32, 8.3.0 - 8.3.32, 8.4.1 - 8.4.23, 8.5.0 - 8.5.8
public hash matches: NO roll: 64331 (full 1..100000)

preferences:
49.36 ms | 767 KiB | 4 Q