<pre>
<?php
$seed = time(); // quite bad choice of seed
echo "Seed: $seed, Random: ".random_bits(512)."\n";
echo "Seed: $seed, Random: ".random_bits(512)."\n";
$seed ^= 0x11fedead;
echo "Seed: $seed, Random: ".random_bits(512)."\n";
// Counts how many bits are needed to represent $value
function count_bits($value) {
for($count = 0; $value != 0; $value >>= 1) {
++$count;
}
return $count;
}
// Returns a base16 random string of at least $bits bits
// Actual bits returned will be a multiple of 4 (1 hex digit)
function random_bits($bits) {
$result = '';
$accumulated_bits = 0;
$usable_bits = intval($total_bits / 8) * 8;
while ($accumulated_bits < $bits) {
$bits_to_add = min($total_bits - $usable_bits, $bits - $accumulated_bits); if ($bits_to_add % 4 != 0) {
// add bits in whole increments of 4
$bits_to_add += 4 - $bits_to_add % 4;
}
// isolate leftmost $bits_to_add from mt_rand() result
$more_bits = mt_rand() & ((1 << $bits_to_add) - 1);
// format as hex (this will be safe)
$format_string = '%0'.($bits_to_add / 4).'x';
$result .= sprintf($format_string, $more_bits); $accumulated_bits += $bits_to_add;
}
return $result;
}
PHByZT4KPD9waHAKCiRzZWVkID0gdGltZSgpOyAvLyBxdWl0ZSBiYWQgY2hvaWNlIG9mIHNlZWQKCm10X3NyYW5kKCRzZWVkKTsKZWNobyAiU2VlZDogJHNlZWQsIFJhbmRvbTogIi5yYW5kb21fYml0cyg1MTIpLiJcbiI7CgptdF9zcmFuZCgkc2VlZCk7CmVjaG8gIlNlZWQ6ICRzZWVkLCBSYW5kb206ICIucmFuZG9tX2JpdHMoNTEyKS4iXG4iOwoKJHNlZWQgXj0gMHgxMWZlZGVhZDsKbXRfc3JhbmQoJHNlZWQpOwplY2hvICJTZWVkOiAkc2VlZCwgUmFuZG9tOiAiLnJhbmRvbV9iaXRzKDUxMikuIlxuIjsKCmRpZTsKCi8vIENvdW50cyBob3cgbWFueSBiaXRzIGFyZSBuZWVkZWQgdG8gcmVwcmVzZW50ICR2YWx1ZQpmdW5jdGlvbiBjb3VudF9iaXRzKCR2YWx1ZSkgewogICAgZm9yKCRjb3VudCA9IDA7ICR2YWx1ZSAhPSAwOyAkdmFsdWUgPj49IDEpIHsKICAgICAgICArKyRjb3VudDsKICAgIH0KICAgIHJldHVybiAkY291bnQ7Cn0KCi8vIFJldHVybnMgYSBiYXNlMTYgcmFuZG9tIHN0cmluZyBvZiBhdCBsZWFzdCAkYml0cyBiaXRzCi8vIEFjdHVhbCBiaXRzIHJldHVybmVkIHdpbGwgYmUgYSBtdWx0aXBsZSBvZiA0ICgxIGhleCBkaWdpdCkKZnVuY3Rpb24gcmFuZG9tX2JpdHMoJGJpdHMpIHsKICAgICRyZXN1bHQgPSAnJzsKICAgICRhY2N1bXVsYXRlZF9iaXRzID0gMDsKICAgICR0b3RhbF9iaXRzID0gY291bnRfYml0cyhtdF9nZXRyYW5kbWF4KCkpOwogICAgJHVzYWJsZV9iaXRzID0gaW50dmFsKCR0b3RhbF9iaXRzIC8gOCkgKiA4OwoKICAgIHdoaWxlICgkYWNjdW11bGF0ZWRfYml0cyA8ICRiaXRzKSB7CiAgICAgICAgJGJpdHNfdG9fYWRkID0gbWluKCR0b3RhbF9iaXRzIC0gJHVzYWJsZV9iaXRzLCAkYml0cyAtICRhY2N1bXVsYXRlZF9iaXRzKTsKICAgICAgICBpZiAoJGJpdHNfdG9fYWRkICUgNCAhPSAwKSB7CiAgICAgICAgICAgIC8vIGFkZCBiaXRzIGluIHdob2xlIGluY3JlbWVudHMgb2YgNAogICAgICAgICAgICAkYml0c190b19hZGQgKz0gNCAtICRiaXRzX3RvX2FkZCAlIDQ7CiAgICAgICAgfQoKICAgICAgICAvLyBpc29sYXRlIGxlZnRtb3N0ICRiaXRzX3RvX2FkZCBmcm9tIG10X3JhbmQoKSByZXN1bHQKICAgICAgICAkbW9yZV9iaXRzID0gbXRfcmFuZCgpICYgKCgxIDw8ICRiaXRzX3RvX2FkZCkgLSAxKTsKCiAgICAgICAgLy8gZm9ybWF0IGFzIGhleCAodGhpcyB3aWxsIGJlIHNhZmUpCiAgICAgICAgJGZvcm1hdF9zdHJpbmcgPSAnJTAnLigkYml0c190b19hZGQgLyA0KS4neCc7CiAgICAgICAgJHJlc3VsdCAuPSBzcHJpbnRmKCRmb3JtYXRfc3RyaW5nLCAkbW9yZV9iaXRzKTsKICAgICAgICAkYWNjdW11bGF0ZWRfYml0cyArPSAkYml0c190b19hZGQ7CiAgICB9CgogICAgcmV0dXJuICRyZXN1bHQ7Cn0K