前言 : 一般的唯一識(shí)別id都是各種時(shí)間戳、毫秒級(jí)時(shí)間戳加php內(nèi)置函數(shù)或者加上隨機(jī)數(shù)等手段來(lái)生成的。 下面給大家介紹一個(gè)組件,也是我在各個(gè)實(shí)戰(zhàn)項(xiàng)目中必不可少的一個(gè)組件,ramsey/uuid。
一、ramsey/uuid的實(shí)現(xiàn)方式
● 機(jī)器hash(防止多臺(tái)機(jī)器之間ID沖突)
● 進(jìn)程ID(防止多進(jìn)程沖突)
● 時(shí)間戳(秒)
● 自增值(同一秒內(nèi)自增)該方法號(hào)稱是1000年以內(nèi)不會(huì)出現(xiàn)重復(fù)數(shù)據(jù)的一種算法id(具體情況是不是這樣,博主也無(wú)從得知,沒有用那么大的數(shù)據(jù)量去特意做個(gè)測(cè)試).
二、適用場(chǎng)景
為什么說(shuō)我在每個(gè)項(xiàng)目中基本上都用到這個(gè)組建呢,記得博主當(dāng)初剛剛步入程序員的時(shí)候經(jīng)常為各個(gè)表的自增id的關(guān)聯(lián)查詢而頭疼 什么uid 、tuid 、 suid ....后來(lái)使用唯一識(shí)別id后大大減輕了這種負(fù)擔(dān)。
1.用戶唯一識(shí)別id
2.多商家時(shí) 產(chǎn)品唯一識(shí)別id
3.訂單號(hào)
4.多表時(shí)的唯一識(shí)別id
還有很多不做一一列舉...
三、使用方法
在Laravel的根目錄中執(zhí)行:
composer require ramsey/uuid
最簡(jiǎn)單直接的引入方法
// 命名空間
use Ramsey\Uuid\Uuid;
$data = Uuid::uuid1();
$str = $data->getHex(); //32位字符串方法
dd($str);
那么他可以獲取多少種數(shù)據(jù)類型呢?Uuid獲取出來(lái)是這樣的
array(
'string' => '6ba7b810-9dad-11d1-80b4-00c04fd430c8',
'curly' => '{6ba7b810-9dad-11d1-80b4-00c04fd430c8}',
'hex' => '6ba7b8109dad11d180b400c04fd430c8',
'bytes' => 'a6e4EJ2tEdGAtADAT9QwyA==',
'int' => '143098242404177361603877621312831893704',
'fields' => array(
'time_low' => '6ba7b810',
'time_mid' => '9dad',
'time_hi_and_version' => '11d1',
'clock_seq_hi_and_reserved' => '80',
'clock_seq_low' => 'b4',
'node' => '00c04fd430c8',
),
'urn' => 'urn:uuid:6ba7b810-9dad-11d1-80b4-00c04fd430c8',
'time' => '1d19dad6ba7b810',
'clock_seq' => '00b4',
'variant' => Uuid::RFC_4122,
'version' => 1,
),
里面的各種長(zhǎng)度可以自定義獲取。另外Uuid的靜態(tài)方法有多少呢?在底部簡(jiǎn)主會(huì)引入原文作者的筆記,方法很多,到目前為止我都沒有用完。 但是簡(jiǎn)主經(jīng)常用的就是:
$data = Uuid::uuid1();
$data = Uuid::uuid2();
$data = Uuid::uuid3();
$data = Uuid::uuid4();
//括號(hào)里面也可以根據(jù)具體業(yè)務(wù)添加參數(shù)
$data = Uuid::uuid1('123123123');
$data = Uuid::uuid1(time());
...
...
如果用在用戶身上,基本上每個(gè)用戶從注冊(cè)開始就相當(dāng)于綁定了一個(gè)身份證(形容是不是很形象)
下面引入原文作者ramsey的原文筆記鏈接 大概快1900行的代碼筆記。
原文筆記