generate($bytes); for ($i = 0; $i < $bytes; $i += 3) { $subBytes = substr($randBytes, $i, 3); $subBytes = str_split($subBytes, 1); $subBytes = ord($subBytes[0]) * 65536 + ord($subBytes[1]) * 256 + ord($subBytes[2]); $subBytes = $subBytes & bindec('00000000111111111111111111111111'); $b = []; $b[0] = $subBytes >> 18; $b[1] = ($subBytes >> 12) & bindec('111111'); $b[2] = ($subBytes >> 6) & bindec('111111'); $b[3] = $subBytes & bindec('111111'); $ret .= $sourceString[$b[0]] . $sourceString[$b[1]] . $sourceString[$b[2]] . $sourceString[$b[3]]; } return substr($ret, 0, $characters); } }