3v4l.org

run code in 300+ PHP versions simultaneously
<?php /** * @param string $password * @param string|null $salt */ function crypt_apr1_md5($password, $salt = null) { if (!$salt) { $salt = substr(base_convert(bin2hex(random_bytes(6)), 16, 36), 1, 8); } $len = strlen($password); $text = $password . '$apr1$' . $salt; $bin = pack("H32", md5($password . $salt . $password)); for ($i = $len; $i > 0; $i -= 16) { $text .= substr($bin, 0, min(16, $i)); } for ($i = $len; $i > 0; $i >>= 1) { $text .= ($i & 1) ? chr(0) : $password[0]; } $bin = pack("H32", md5($text)); for ($i = 0; $i < 1000; $i++) { $new = ($i & 1) ? $password : $bin; if ($i % 3) { $new .= $salt; } if ($i % 7) { $new .= $password; } $new .= ($i & 1) ? $bin : $password; $bin = pack("H32", md5($new)); } $tmp = ''; for ($i = 0; $i < 5; $i++) { $k = $i + 6; $j = $i + 12; if ($j == 16) { $j = 5; } $tmp = $bin[$i] . $bin[$k] . $bin[$j] . $tmp; } $tmp = chr(0) . chr(0) . $bin[11] . $tmp; $tmp = strtr( strrev(substr(base64_encode($tmp), 2)), "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/", "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" ); return "$" . "apr1" . "$" . $salt . "$" . $tmp; } $salt = substr(base_convert(bin2hex(random_bytes(6)), 16, 36), 1, 8); var_dump( crypt_apr1_md5('password', $salt), crypt_apr1_md5('password', $salt) ); var_dump( crypt_apr1_md5('password'), crypt_apr1_md5('password') );

preferences:
37.36 ms | 402 KiB | 5 Q