Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 25
0.00% covered (danger)
0.00%
0 / 4
CRAP
0.00% covered (danger)
0.00%
0 / 1
RandomStringGenerator
0.00% covered (danger)
0.00%
0 / 25
0.00% covered (danger)
0.00%
0 / 4
56
0.00% covered (danger)
0.00%
0 / 1
 __construct
0.00% covered (danger)
0.00%
0 / 7
0.00% covered (danger)
0.00%
0 / 1
6
 setAlphabet
0.00% covered (danger)
0.00%
0 / 2
0.00% covered (danger)
0.00%
0 / 1
2
 generate
0.00% covered (danger)
0.00%
0 / 5
0.00% covered (danger)
0.00%
0 / 1
6
 getRandomInteger
0.00% covered (danger)
0.00%
0 / 11
0.00% covered (danger)
0.00%
0 / 1
6
1<?php
2
3namespace BuyerKiosk\Core;
4
5/**
6 * Random String Generator
7 *
8 * Generates cryptographically secure random strings using OpenSSL.
9 *
10 * @package BuyerKiosk\Core
11 */
12class RandomStringGenerator
13{
14    /** @var string */
15    protected $alphabet;
16
17    /** @var int */
18    protected $alphabetLength;
19
20
21    /**
22     * @param string $alphabet
23     */
24    public function __construct($alphabet = '')
25    {
26        if ('' !== $alphabet) {
27            $this->setAlphabet($alphabet);
28        } else {
29            $this->setAlphabet(
30                implode(range('a', 'z'))
31                . implode(range('A', 'Z'))
32                . implode(range(0, 9))
33            );
34        }
35    }
36
37    /**
38     * @param string $alphabet
39     */
40    public function setAlphabet($alphabet)
41    {
42        $this->alphabet = $alphabet;
43        $this->alphabetLength = strlen($alphabet);
44    }
45
46    /**
47     * @param int $length
48     * @return string
49     */
50    public function generate($length)
51    {
52        $token = '';
53
54        for ($i = 0; $i < $length; $i++) {
55            $randomKey = $this->getRandomInteger(0, $this->alphabetLength);
56            $token .= $this->alphabet[$randomKey];
57        }
58
59        return $token;
60    }
61
62    /**
63     * @param int $min
64     * @param int $max
65     * @return int
66     */
67    protected function getRandomInteger($min, $max)
68    {
69        $range = ($max - $min);
70
71        if ($range < 0) {
72            // Not so random...
73            return $min;
74        }
75
76        $log = log($range, 2);
77
78        // Length in bytes.
79        $bytes = (int) ($log / 8) + 1;
80
81        // Length in bits.
82        $bits = (int) $log + 1;
83
84        // Set all lower bits to 1.
85        $filter = (int) (1 << $bits) - 1;
86
87        do {
88            $rnd = hexdec(bin2hex(openssl_random_pseudo_bytes($bytes)));
89
90            // Discard irrelevant bits.
91            $rnd = $rnd & $filter;
92
93        } while ($rnd >= $range);
94
95        return ($min + $rnd);
96    }
97}