1*c3437056SNickeau<?php 2*c3437056SNickeaunamespace Hidehalo\Nanoid; 3*c3437056SNickeau 4*c3437056SNickeauclass Core implements CoreInterface 5*c3437056SNickeau{ 6*c3437056SNickeau /** 7*c3437056SNickeau * @inheritDoc 8*c3437056SNickeau * @see https://github.com/ai/nanoid/blob/master/async/index.browser.js#L4 9*c3437056SNickeau */ 10*c3437056SNickeau public function random(GeneratorInterface $generator, $size, $alphabet = CoreInterface::SAFE_SYMBOLS) 11*c3437056SNickeau { 12*c3437056SNickeau $len = strlen($alphabet); 13*c3437056SNickeau $mask = (2 << log($len - 1) / M_LN2) - 1; 14*c3437056SNickeau $step = (int) ceil(1.6 * $mask * $size / $len); 15*c3437056SNickeau $id = ''; 16*c3437056SNickeau while (true) { 17*c3437056SNickeau $bytes = $generator->random($step); 18*c3437056SNickeau for ($i = 1; $i <= $step; $i++) { 19*c3437056SNickeau $byte = $bytes[$i] & $mask; 20*c3437056SNickeau if (isset($alphabet[$byte])) { 21*c3437056SNickeau $id .= $alphabet[$byte]; 22*c3437056SNickeau if (strlen($id) === $size) { 23*c3437056SNickeau 24*c3437056SNickeau return $id; 25*c3437056SNickeau } 26*c3437056SNickeau } 27*c3437056SNickeau } 28*c3437056SNickeau } 29*c3437056SNickeau } 30*c3437056SNickeau} 31