dazlo /library/Daz/Crypt/Guid.php

Language PHP Lines 88
MD5 Hash 88599d4cd9c0e95de0724e98de872b10 Estimated Cost $776 (why?)
Repository https://github.com/dlorenso/dazlo.git View Raw File View Project SPDX
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
<?php
/**
 * Dazlo Framework Copyright (c) 2012 D. Dante Lorenso.  All Rights Reserved.
 * This source file is subject to the new BSD license that is bundled with
 * this package in the file LICENSE.txt.  It is also available through the
 * world-wide web at this URL:
 * http://www.opensource.org/licenses/bsd-license.php
 */
namespace Daz\Crypt;

class Guid
{
    /**
     * Like "uuid" function, but in a more readable format, and without hyphens.
     * @return  string  A UUID, made up of 32 hex digits.
     */
    public static function guid()
    {
        return call_user_func_array(
            'sprintf',
            array(
                // format
                '%04x%04x' . '%04x' . '%03x4' . '%04x' . '%04x%04x%04x',
                // 32 bits for "time_low"
                mt_rand(0, 65535),
                mt_rand(0, 65535),
                // 16 bits for "time_mid"
                mt_rand(0, 65535),
                // 12 bits before the 0100 of (version) 4 for "time_hi_and_version"
                mt_rand(0, 4095),
                // 8 bits, the last two of which (positions 6 and 7) are 01, for "clk_seq_hi_res"
                // (hence, the 2nd hex digit after the 3rd hyphen can only be 1, 5, 9 or d)
                // 8 bits for "clk_seq_low"
                bindec(substr_replace(sprintf('%016b', mt_rand(0, 65535)), '01', 6, 2)),
                // 48 bits for "node"
                mt_rand(0, 65535),
                mt_rand(0, 65535),
                mt_rand(0, 65535)
            )
        );
    }

    /**
     * Generates a Universally Unique IDentifier, version 4.
     * RFC 4122 (http://www.ietf.org/rfc/rfc4122.txt) defines a special type of
     * Globally Unique IDentifiers (GUID), as well as several methods for
     * producing them. One such method, described in section 4.4, is based on
     * truly random or pseudo-random number generators, and is therefore
     * implementable in a language like PHP.
     * We choose to produce pseudo-random numbers with the Mersenne Twister, and
     * to always limit single generated numbers to 16 bits (ie. the decimal
     * value 65535). That is because, even on 32-bit systems, PHP's RAND_MAX
     * will often be the maximum *signed* value, with only the equivalent of 31
     * significant bits. Producing two 16-bit random numbers to make up a 32-bit
     * one is less efficient, but guarantees that all 32 bits are random.
     * The algorithm for version 4 UUIDs (ie. those based on random number
     * generators) states that all 128 bits separated into the various fields
     * (32 bits, 16 bits, 16 bits, 8 bits and 8 bits, 48 bits) should be random,
     * except : (a) the version number should be the last 4 bits in the 3rd
     * field, and (b) bits 6 and 7 of the 4th field should be 01. We try to
     * conform to that definition as efficiently as possible, generating smaller
     * values where possible, and minimizing the number of base conversions.
     * @copyright Copyright (c) CFD Labs, 2006. This function may be used freely
     * for any purpose ; it is distributed without any form of warranty
     * whatsoever.
     * @author David Holmes <dholmes@cfdsoftware.net>
     * @return  string  A UUID, made up of 32 hex digits and 4 hyphens.
     */
    public static function uuid()
    {
        // The field names refer to RFC 4122 section 4.1.2
        return sprintf(
            '%04x%04x-%04x-%03x4-%04x-%04x%04x%04x',
            mt_rand(0, 65535),
            mt_rand(0, 65535), // 32 bits for "time_low"
            mt_rand(0, 65535), // 16 bits for "time_mid"
            mt_rand(0, 4095), // 12 bits before the 0100 of (version) 4 for "time_hi_and_version"
            bindec(substr_replace(sprintf('%016b', mt_rand(0, 65535)), '01', 6, 2)),
            // 8 bits, the last two of which (positions 6 and 7) are 01, for "clk_seq_hi_res"
            // (hence, the 2nd hex digit after the 3rd hyphen can only be 1, 5, 9 or d)
            // 8 bits for "clk_seq_low"
            mt_rand(0, 65535),
            mt_rand(0, 65535),
            mt_rand(0, 65535) // 48 bits for "node"
        );
    }

}
Back to Top