Yii 生成uuid的几种方法

UUID 是 通用唯一识别码(Universally Unique Identifier)的缩写,是一种软件建构的标准,亦为开放软件基金会组织在分布式计算环境领域的一部分。其目的,是让分布式系统中的所有元素,都能有唯一的辨识信息,而不需要通过中央控制端来做辨识信息的指定。
UUID由以下几部分的组合:
(1)当前日期和时间,UUID的第一个部分与时间有关,如果你在生成一个UUID之后,过几秒又生成一个UUID,则第一个部分不同,其余相同。
(2)时钟序列。
(3)全局唯一的IEEE机器识别号,如果有网卡,从网卡MAC地址获得,没有网卡以其他方式获得。(来自百度百科)

1. 利用mysql uuid()函数

$row= Yii::$app->db->createCommand("select uuid() as uuid")->queryOne();
echo $row['uuid'];

执行结果(5次)

b8cc7eca-125e-11e9-8b0d-080027b68021
b8cc873d-125e-11e9-8b0d-080027b68021
b8cc8e51-125e-11e9-8b0d-080027b68021
b8cc94a4-125e-11e9-8b0d-080027b68021
b8cc9ace-125e-11e9-8b0d-080027b68021

2. 使用Faker\Provider\Uuid;这个类库(伪uuid)

use Faker\Provider\Uuid;

echo Uuid::uuid();

执行结果(5次)

866b6cd0-4f64-3427-8f69-36fd46f7f497
148aac48-73f8-3522-b2c2-15b04942b016
668a65aa-fffb-361b-875c-6a7ec7eebfcb
a9331537-48b2-3387-9879-649f20988982
3d6bb628-1eff-34cb-882f-72a519373975

这个类的源码

public static function uuid()
    {
        // fix for compatibility with 32bit architecture; seed range restricted to 62bit
        $seed = mt_rand(0, 2147483647) . '#' . mt_rand(0, 2147483647);

        // Hash the seed and convert to a byte array
        $val = md5($seed, true);
        $byte = array_values(unpack('C16', $val));

        // extract fields from byte array
        $tLo = ($byte[0] << 24) | ($byte[1] << 16) | ($byte[2] << 8) | $byte[3];
        $tMi = ($byte[4] << 8) | $byte[5];
        $tHi = ($byte[6] << 8) | $byte[7];
        $csLo = $byte[9];
        $csHi = $byte[8] & 0x3f | (1 << 7);

        // correct byte order for big edian architecture
        if (pack('L', 0x6162797A) == pack('N', 0x6162797A)) {
            $tLo = (($tLo & 0x000000ff) << 24) | (($tLo & 0x0000ff00) << 8)
                | (($tLo & 0x00ff0000) >> 8) | (($tLo & 0xff000000) >> 24);
            $tMi = (($tMi & 0x00ff) << 8) | (($tMi & 0xff00) >> 8);
            $tHi = (($tHi & 0x00ff) << 8) | (($tHi & 0xff00) >> 8);
        }

        // apply version number
        $tHi &= 0x0fff;
        $tHi |= (3 << 12);

        // cast to string
        $uuid = sprintf(
            '%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x',
            $tLo,
            $tMi,
            $tHi,
            $csHi,
            $csLo,
            $byte[10],
            $byte[11],
            $byte[12],
            $byte[13],
            $byte[14],
            $byte[15]
        );

        return $uuid;
    }

你可能感兴趣的:(Yii 生成uuid的几种方法)