xref: /plugin/combo/vendor/hidehalo/nanoid-php/src/Core.php (revision c3437056399326d621a01da73b649707fbb0ae69)
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