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') );
Output for git.master
string(37) "$apr1$1ae28b1w$PxECStEtZXKzfWedL7YCX1" string(37) "$apr1$1ae28b1w$PxECStEtZXKzfWedL7YCX1" string(37) "$apr1$c5e4fl5f$FNKowuSTnBIZEGrxJ2vmB." string(37) "$apr1$911uqh7o$IMc2sPiyDoYhZrHC1VJlf."

This tab shows result from various feature-branches currently under review by the php developers. Contact me to have additional branches featured.

Active branches

Archived branches

Once feature-branches are merged or declined, they are no longer available. Their functionality (when merged) can be viewed from the main output page


preferences:
46.62 ms | 401 KiB | 6 Q