3v4l.org

run code in 300+ PHP versions simultaneously
<?php if (!function_exists('random_bytes')) { /** * PHP 5.2.0 - 5.6.x way to implement random_bytes() * * In order of preference: * 1. mcrypt_create_iv($bytes, MCRYPT_CREATE_IV) * 2. fread() /dev/arandom if available * 3. fread() /dev/urandom if available * 4. COM('CAPICOM.Utilities.1')->GetRandom() * 5. openssl_random_pseudo_bytes() */ if (function_exists('mcrypt_create_iv') && version_compare(PHP_VERSION, '5.3.7') >= 0) { /** * Powered by ext/mcrypt * * @param int $bytes * @return string */ function random_bytes($bytes) { if (!is_int($bytes)) { throw new Exception( 'Length must be an integer' ); } if ($bytes < 1) { throw new Exception( 'Length must be greater than 0' ); } // See PHP bug #55169 for why 5.3.7 is required $buf = mcrypt_create_iv($bytes, MCRYPT_DEV_URANDOM); if ($buf !== false) { if (RandomCompat_strlen($buf) === $bytes) { return $buf; } } /** * If we reach here, PHP has failed us. */ throw new Exception( 'PHP failed to generate random data.' ); } } elseif (!ini_get('open_basedir') && (is_readable('/dev/arandom') || is_readable('/dev/urandom'))) { /** * Use /dev/arandom or /dev/urandom for random numbers * * @ref http://sockpuppet.org/blog/2014/02/25/safely-generate-random-numbers * * @param int $bytes * @return string */ function random_bytes($bytes) { static $fp = null; if ($fp === null) { if (is_readable('/dev/arandom')) { $fp = fopen('/dev/arandom', 'rb'); } else { $fp = fopen('/dev/urandom', 'rb'); } } if ($fp !== false) { $streamset = stream_set_read_buffer($fp, 0); if ($streamset === 0) { $remaining = $bytes; $buf = ''; do { $read = fread($fp, $remaining); if ($read === false) { // We cannot safely read from urandom. $buf = false; break; } // Decrease the number of bytes returned from remaining $remaining -= RandomCompat_strlen($read); $buf .= $read; } while ($remaining > 0); if ($buf !== false) { if (RandomCompat_strlen($buf) === $bytes) { /** * Return our random entropy buffer here: */ return $buf; } } } } /** * If we reach here, PHP has failed us. */ throw new Exception( 'PHP failed to generate random data.' ); } } elseif (extension_loaded('com_dotnet')) { /** * Windows with PHP < 5.3.0 will not have the function * openssl_random_pseudo_bytes() available, so let's use * CAPICOM to work around this deficiency. * * @param int $bytes * @return string */ function random_bytes($bytes) { $buf = ''; $util = new COM('CAPICOM.Utilities.1'); $execCount = 0; /** * Let's not let it loop forever. If we run N times and fail to * get N bytes of random data, then CAPICOM has failed us. */ do { $buf .= base64_decode($util->GetRandom($bytes, 0)); if (RandomCompat_strlen($buf) >= $bytes) { return RandomCompat_substr($buf, 0, $bytes); } ++$execCount; } while ($execCount < $bytes); /** * If we reach here, PHP has failed us. */ throw new Exception( 'PHP failed to generate random data.' ); } } elseif (function_exists('openssl_random_pseudo_bytes')) { /** * Since openssl_random_pseudo_bytes() uses openssl's * RAND_pseudo_bytes() API, which has been marked as deprecated by the * OpenSSL team, this is our last resort before failure. * * @ref https://www.openssl.org/docs/crypto/RAND_bytes.html * * @param int $bytes * @return string */ function random_bytes($bytes) { $secure = true; $buf = openssl_random_pseudo_bytes($bytes, $secure); if ($buf !== false && $secure) { if (RandomCompat_strlen($buf) === $bytes) { return $buf; } } /** * If we reach here, PHP has failed us. */ throw new Exception( 'PHP failed to generate random data.' ); } } else { /** * We don't have any more options, so let's throw an exception right now */ throw new Exception( 'There is no suitable CSPRNG installed on your system' ); } } if (!function_exists('RandomCompat_strlen')) { if (function_exists('mb_substr')) { /** * strlen() implementation that isn't brittle to mbstring.func_overload * * This version uses mb_strlen() in '8bit' mode to treat strings as raw * binary rather than UTF-8, ISO-8859-1, etc * * @param string $binary_string * * @return int */ function RandomCompat_strlen($binary_string) { if (!is_string($binary_string)) { throw new InvalidArgumentException( 'RandomCompat_strlen() expects a string' ); } return mb_strlen($binary_string, '8bit'); } } else { /** * strlen() implementation that isn't brittle to mbstring.func_overload * * This version just used the default strlen() * * @param string $binary_string * * @return int */ function RandomCompat_strlen($binary_string) { if (!is_string($binary_string)) { throw new InvalidArgumentException( 'RandomCompat_strlen() expects a string' ); } return strlen($binary_string); } } } if (!function_exists('RandomCompat_substr')) { if (function_exists('mb_substr')) { /** * substr() implementation that isn't brittle to mbstring.func_overload * * This version uses mb_substr() in '8bit' mode to treat strings as raw * binary rather than UTF-8, ISO-8859-1, etc * * @param string $binary_string * @param int $start * @param int $length (optional) * * @return string */ function RandomCompat_substr($binary_string, $start, $length = null) { if (!is_string($binary_string)) { throw new InvalidArgumentException( 'RandomCompat_substr(): First argument should be a string' ); } if (!is_int($start)) { throw new InvalidArgumentException( 'RandomCompat_substr(): Second argument should be an integer' ); } if ($length === null) { /** * mb_substr($str, 0, NULL, '8bit') returns an empty string on * PHP 5.3, so we have to find the length ourselves. */ $length = RandomCompat_strlen($length) - $start; } elseif (!is_int($length)) { throw new InvalidArgumentException( 'RandomCompat_substr(): Third argument should be an integer, or omitted' ); } return mb_substr($binary_string, $start, $length, '8bit'); } } else { /** * substr() implementation that isn't brittle to mbstring.func_overload * * This version just used the default substr() * * @param string $binary_string * @param int $start * @param int $length (optional) * * @return string */ function RandomCompat_substr($binary_string, $start, $length = null) { if (!is_string($binary_string)) { throw new InvalidArgumentException( 'RandomCompat_substr(): First argument should be a string' ); } if (!is_int($start)) { throw new InvalidArgumentException( 'RandomCompat_substr(): Second argument should be an integer' ); } if ($length !== null) { if (!is_int($length)) { throw new InvalidArgumentException( 'RandomCompat_substr(): Third argument should be an integer, or omitted' ); } return substr($binary_string, $start, $length); } return substr($binary_string, $start); } } } var_dump( implode('-', [ bin2hex(random_bytes(4)), bin2hex(random_bytes(2)), bin2hex(\chr((\ord(random_bytes(1)) & 0x0F) | 0x40)) . bin2hex(random_bytes(1)), bin2hex(\chr((\ord(random_bytes(1)) & 0x3F) | 0x80)) . bin2hex(random_bytes(1)), bin2hex(random_bytes(12)) ]) );
Output for 7.2.0
string(48) "81c2df68-4c35-401f-94d1-574b61f779da2f1bca7be65d"
Output for 7.1.7
string(48) "b6092bfc-45ab-4130-9de6-cbecdce4e497ccb246df9822"
Output for 7.1.6
string(48) "e08688ad-6e64-4b7f-a21d-6d3ca92e4595aade82778453"
Output for 7.1.5
string(48) "95d47986-25f6-490a-a1a6-ae7272b6aaee988c613d5b5d"
Output for 7.1.0
string(48) "63d6612b-8316-4364-9b01-38c7372ab2f2db5356e677a2"
Output for 7.0.20
string(48) "efa16276-2e38-464a-af3a-1ea6e40f85decbbb2a427767"
Output for 7.0.10
string(48) "b0737eae-bc98-4100-bd3f-41024d301f0b6bbfd5a5439d"
Output for 7.0.9
string(48) "d869d685-19d8-4374-9742-99ed363a6d23d23b7bdc6a1d"
Output for 7.0.8
string(48) "4a95b679-a972-4135-85e9-6e1873193aa294ec0107e2d9"
Output for 7.0.7
string(48) "232ff338-8e19-455c-aecd-c7a8cdca330ad81dd299be89"
Output for 7.0.6
string(48) "87d021a7-b96e-485b-889d-81567e01ed8182b8ab6074d4"
Output for 7.0.5
string(48) "35822072-f8a7-4f8a-9986-cbbe5d8c42d9626958756b01"
Output for 7.0.4
string(48) "5bf919ee-6c6b-48e6-919d-9556b97675df52d1fcdc7d15"
Output for 7.0.3
string(48) "98005af3-ebf9-4a96-a27d-f0e0dbf67298952bccada02b"
Output for 7.0.2
string(48) "3c0a81cb-f84d-4eec-aa33-869a070f935965463aeee2a6"
Output for 7.0.1
string(48) "4a9f4808-ddca-42a3-b052-f2dd560d71ccd75081626d35"
Output for 7.0.0
string(48) "b1df7b0d-c494-473c-adec-38e203b4b1eecdb9b01aa5ee"
Output for 5.6.28
string(48) "d5b3b0ba-91a9-4e31-b6a6-4bbc3fdbce9789923cdd327e"
Output for 5.6.25
string(48) "49006b83-8943-47ae-b0ad-bb3441f66bc1b9256eb5e50f"
Output for 5.6.24
string(48) "c6ee525b-4e7e-42b0-a7f2-566e430bfd228016bdaa276f"
Output for 5.6.23
string(48) "37950059-6ff9-46a9-92c9-e7ae6be4532d6d173d1dac26"
Output for 5.6.22
string(48) "f95f5047-c83f-40b4-9bf9-6a1f6bf392198ac63e514a53"
Output for 5.6.21
string(48) "7c117518-7ac3-442e-b4ef-6ace8258b494032688956a3b"
Output for 5.6.20
string(48) "5926df47-71be-4148-939d-460b53b6aa2a498b2f85f899"
Output for 5.6.19
string(48) "62d47832-340c-4f5f-98db-22d25d0b294195b38fdd63ec"
Output for 5.6.18
string(48) "a07ab18e-86b1-4cd6-9a81-0df95e9792712f45834e6dcc"
Output for 5.6.17
string(48) "ec1363a3-6594-423c-962e-6a0e06c702484b7615295c5a"
Output for 5.6.16
string(48) "2666418e-f0b8-4f07-8e94-d8950b74c352d07313663e53"
Output for 5.6.15
string(48) "d5a0c092-1030-4986-ba5c-0bd7761070b97491965f6e6a"
Output for 5.6.14
string(48) "55804f5f-687a-4532-ab35-5b0042b65f212a6b4544a4ff"
Output for 5.6.13
string(48) "b158eeca-1d12-43f4-8ffd-e1fb5255ed64507940cbb526"
Output for 5.6.12
string(48) "3768017c-545d-4693-a752-9861a015b6475c709ee7c98f"
Output for 5.6.11
string(48) "92956df7-5e6c-4ef9-b1aa-3a4237130e5e9505f5e37437"
Output for 5.6.10
string(48) "b1b3574a-fb7c-4e27-8285-01af4d711e4d7271b099b5ec"
Output for 5.6.9
string(48) "51d6af68-cf31-46d9-8c92-76562786990dcf97b642ae67"
Output for 5.6.8
string(48) "e6d3f2b3-b92e-4969-8a09-ceb4410d78292588f2e036c2"
Output for 5.6.7
string(48) "cdc819ef-3bc5-4ada-96be-94cf81b15f3b32fe9d9fbf82"
Output for 5.6.6
string(48) "d62adbc3-ba62-4a78-a067-9fb469d9b69e7f2552759fc9"
Output for 5.6.5
string(48) "6c26ff62-0535-4bc7-9a4a-bcfa5649b10d39de15cc0ed9"
Output for 5.6.4
string(48) "f7f4c3ef-ebbc-46d3-8339-1f20f2d2b150c5b92f891581"
Output for 5.6.3
string(48) "45971742-b2bb-4f1f-8dfa-40eaccea543220a31970bb69"
Output for 5.6.2
string(48) "6fafa79b-1553-4097-92d5-2b71cdd11380ad38ab036020"
Output for 5.6.1
string(48) "ea994303-a1e3-4b7a-93d7-5334e1462824c77d1b5c9879"
Output for 5.6.0
string(48) "d888a9fd-3788-42f2-ad4a-956403f2df9d7cb0f24be7b3"
Output for 5.5.38
string(48) "75e0a65c-c376-4591-b0f3-22beb0949c0dd2c06ecafb6c"
Output for 5.5.37
string(48) "88b606fa-e428-4e4d-8e5c-5e5495d90c4b6bbe1c6ce79a"
Output for 5.5.36
string(48) "ab5c8159-6ba3-4949-be75-29336ba3ca5cf618d0fff656"
Output for 5.5.35
string(48) "ee8f170f-3005-4844-8cde-6480c3f1b2359f774ba0572a"
Output for 5.5.34
string(48) "7eadec05-2d36-4815-a182-de447f5cec9eeaf72a376186"
Output for 5.5.33
string(48) "0bb46f8c-4fef-4697-9d86-80713bc2311c5fbc68ea5c7f"
Output for 5.5.32
string(48) "77cce4b7-3e7e-4171-b936-89a7709a57826986abe960e5"
Output for 5.5.31
string(48) "7f6d6b39-ce70-4431-8303-aa553433a8c260a2487712dd"
Output for 5.5.30
string(48) "d94113de-adf4-4bcc-8038-8788a4e7d4aac7ad44bc2dfe"
Output for 5.5.29
string(48) "4c5bea4b-6f2c-4041-ad34-6d9a0d40a053ebd2d9ffac51"
Output for 5.5.28
string(48) "0104d173-7b6f-45a5-92ba-6bed0c5cf5df51d660274ea4"
Output for 5.5.27
string(48) "8952b342-f6fb-4217-ab90-87e27a2899c2887f2404ef3a"
Output for 5.5.26
string(48) "9dd8072f-492d-48b2-8a8e-0fd36046d64d25190c43438d"
Output for 5.5.25
string(48) "3a65e339-c375-432d-8ef8-7930485f138d44d08f1260b6"
Output for 5.5.24
string(48) "c22c3a1c-6b38-4c7a-b7ca-90bb1e72a66ca13ccce39491"
Output for 5.5.23
string(48) "7e4d9893-e9d6-4ca3-a439-6d62da5099be63314b57cb62"
Output for 5.5.22
string(48) "3c84bfdd-8542-47b7-a1d1-d4a3fc4f4eb5b752f1f1e1f1"
Output for 5.5.21
string(48) "9f7ecb5d-e741-48c9-9bf0-9d2acc7003e2458567d7fd15"
Output for 5.5.20
string(48) "4655ac72-2d0f-4140-bf63-200e9dc614efce181d1c51f8"
Output for 5.5.19
string(48) "d438281c-f04e-4d98-b753-3db321fbea79f726ceb71dd7"
Output for 5.5.18
string(48) "2d109383-f582-4fd2-ab80-6e76a709dc860c32cc2c6e89"
Output for 5.5.16
string(48) "cc06c2e6-3fe3-42f0-bc36-948d504893940987369a8b97"
Output for 5.5.15
string(48) "c3ffefc3-aab8-4696-b30e-e4ee2631c4ef7363af07fc68"
Output for 5.5.14
string(48) "57ff9b1e-aada-4371-a76a-b0492976c142b77c0d4263e0"
Output for 5.5.13
string(48) "0a05081a-60d3-492b-a8af-ef709d239706481d29d29f36"
Output for 5.5.12
string(48) "8f10be3c-d163-46d6-a0d7-e5269ff534a233a72400f58d"
Output for 5.5.11
string(48) "0ba5da8f-054a-43c0-98a0-c6b51ba9f9a8b7eebaa74f4a"
Output for 5.5.10
string(48) "db7559bf-38d3-492b-9b65-58a3632f19fc24c58ff54dd8"
Output for 5.5.9
string(48) "373a4b41-ade5-4771-8bef-beaebda054bca6460012a598"
Output for 5.5.8
string(48) "616395fc-ba47-407a-a803-838618ae32961443cce12bd2"
Output for 5.5.7
string(48) "bcecee20-bbfb-4a78-ad14-1bb3dea287e7f709ac47b490"
Output for 5.5.6
string(48) "04711f7c-89ab-475d-9812-58ba153acc3fb557195aaf63"
Output for 5.5.5
string(48) "0f7a7629-3d48-42de-a88e-2b3c3d006f5cf02721137611"
Output for 5.5.4
string(48) "6f5c9c0e-6b78-439a-8a9f-fab0f49e19798865d5fe3ee5"
Output for 5.5.3
string(48) "f250afd8-f841-40d7-bbda-ee0fc66431b58c192eb6130a"
Output for 5.5.2
string(48) "730d94fd-4eee-466a-9e65-51fd7fc6a46b75a06f6ac3de"
Output for 5.5.1
string(48) "a7260ddc-7669-47eb-a0f0-e53e735914481ed0e70ee98a"
Output for 5.5.0
string(48) "b2dca5f6-31ee-41c9-84f6-d251e435917823820ef8ebdd"
Output for 5.4.45
string(48) "21fc8f7b-1def-4020-af0f-ccd2a1a213c5093884c579fd"
Output for 5.4.44
string(48) "58371238-6359-4e5d-a5bc-ab65b1ef15d9ea911e077013"
Output for 5.4.43
string(48) "b9a01331-2689-4943-b3ed-ff2b11879b974cd04203a363"
Output for 5.4.42
string(48) "35f6d9c0-247c-4052-bf95-4d0636d45bad64947203be70"
Output for 5.4.41
string(48) "df11ced6-8ba6-4c55-a9a3-02fddb4ce05ad44b1ce0633a"
Output for 5.4.40
string(48) "87bd1405-f7cd-408e-96dd-885b94bdeb3fe65662aaef2a"
Output for 5.4.39
string(48) "aff0b13a-0447-4271-b189-08f7254fafc24b01c8a40b0c"
Output for 5.4.38
string(48) "178b93cf-c458-4bec-8419-8e38b6bf1ec3fea887cdaa0c"
Output for 5.4.37
string(48) "571b80e0-003d-403c-b9c1-1c4e7a4ac2e82f48c000b418"
Output for 5.4.36
string(48) "2b443456-bf8f-4386-bcd6-590ae8d332a394875d9624c7"
Output for 5.4.35
string(48) "f1914f46-ef3d-4bac-af0e-cbba3147d39816ae76ba2bbb"
Output for 5.4.34
string(48) "5cce88dd-9512-44e9-a8f3-a2bd8f258e6e3382b7c55b14"
Output for 5.4.32
string(48) "dfca2ff6-c989-4284-b2bd-a6a63e6c7c435c0f6e1100f8"
Output for 5.4.31
string(48) "9cf66ee6-8108-4f3f-a594-4393950e978f2be3d73b00b1"
Output for 5.4.30
string(48) "a9f24a77-3bd3-4bd0-b94f-e2a0a32b2c7283898ce84cc6"
Output for 5.4.29
string(48) "cd45e559-92db-4c09-994a-6da358992e2350095a723c32"
Output for 5.4.28
string(48) "74ccad4d-8939-49c1-bdc2-4dc38d07bb1b0953e7a5833e"
Output for 5.4.27
string(48) "4aa6d1c2-5c53-4d39-807a-9e308e2ab92d5764d3f5b445"
Output for 5.4.26
string(48) "7be9662a-b6cc-4b12-9b04-a92dae84131d23c123c77c93"
Output for 5.4.25
string(48) "6705d05b-478e-4084-b467-ae62f50240013e44e3c6a17a"
Output for 5.4.24
string(48) "a9cca4e6-0b50-438b-bef3-b5b6629969fecce0eb17ba85"
Output for 5.4.23
string(48) "bc96fe2c-c0e8-4226-857a-0fb7d1208c6e0cd285d3aa21"
Output for 5.4.22
string(48) "f8184dc7-8489-4536-b4b5-821fd6f542b31b7f18b1c92f"
Output for 5.4.21
string(48) "59f8a414-b000-4ee9-a8b2-defa91d3a83d5eb616474c02"
Output for 5.4.20
string(48) "0136607f-0f46-450b-ae35-0fa1db855bc3757a6aaa0d29"
Output for 5.4.19
string(48) "e1eea199-73b6-4d66-ac3e-d0d1116513bedd966d4ce60f"
Output for 5.4.18
string(48) "c5de0b0b-2b51-405e-8a11-7b76fbf0f03012a1b2940414"
Output for 5.4.17
string(48) "5f803fe9-f13c-42fe-bc5f-830db06d0896ce6a3dc8d711"
Output for 5.4.16
string(48) "2b50a0a6-b32a-4e4a-9bf4-197db1365a58f4a591d79168"
Output for 5.4.15
string(48) "8d759033-b656-4b62-a0f6-41e759af086673a2218ed067"
Output for 5.4.14
string(48) "488db2eb-84a0-4f4f-9346-2d8ee7a9fd9b8332b84e5f60"
Output for 5.4.13
string(48) "4dbaf982-944c-4f18-8773-ed1112c5710ad99e69c6bafc"
Output for 5.4.12
string(48) "82f3e94e-e88c-4759-bdd5-6cf074bfa1aae6b3890aff4f"
Output for 5.4.11
string(48) "78156666-f720-4461-9c5c-9822f3a23b25047593a28fef"
Output for 5.4.10
string(48) "3023aa36-e34e-46db-afc4-cf397081c24e2a8c8785de64"
Output for 5.4.9
string(48) "99c1bac0-9834-4fcd-9480-98e7b4b94482f5b363ebd2cf"
Output for 5.4.8
string(48) "87fabbb5-9ed4-498a-9f30-d327799ad0fe869f91e51367"
Output for 5.4.7
string(48) "4e4512c3-eb5c-47fe-910a-54f06b89a63b1a4113d2dc1a"
Output for 5.4.6
string(48) "ce91bea7-be5f-492f-b837-5f4b92af6ddf066afcd8a797"
Output for 5.4.5
string(48) "6a0913ed-502e-4cfd-b102-6b1947e28fb2f63498320fd3"
Output for 5.4.4
string(48) "64b59465-254e-4709-86c9-9bafb0cf94096483e424f3d5"
Output for 5.4.3
string(48) "29bd5b27-2693-4f52-a00b-26313ee3375f803e2f91daaf"
Output for 5.4.2
string(48) "ac5f0a64-20a3-4b64-9de0-0949793d0f604a60ace583b1"
Output for 5.4.1
string(48) "f14fc579-6285-41b6-b4c2-295968ebc2d84d06995c23bc"
Output for 5.4.0
string(48) "20028e46-ab94-4674-be29-7823a33455841afcf71f972c"

preferences:
88.3 ms | 401 KiB | 132 Q