前言 : 一般的唯一識別id都是各種時間戳揭芍、毫秒級時間戳加php內(nèi)置函數(shù)或者加上隨機數(shù)等手段來生成的。 下面給大家介紹一個組件控淡,也是我在各個實戰(zhàn)項目中必不可少的一個組件饭聚,ramsey/uuid忌警。
一、ramsey/uuid的實現(xiàn)方式
● 機器hash(防止多臺機器之間ID沖突)
● 進程ID(防止多進程沖突)
● 時間戳(秒)
● 自增值(同一秒內(nèi)自增)該方法號稱是1000年以內(nèi)不會出現(xiàn)重復(fù)數(shù)據(jù)的一種算法id(具體情況是不是這樣若治,博主也無從得知慨蓝,沒有用那么大的數(shù)據(jù)量去特意做個測試).
二、適用場景
為什么說我在每個項目中基本上都用到這個組建呢端幼,記得博主當(dāng)初剛剛步入程序員的時候經(jīng)常為各個表的自增id的關(guān)聯(lián)查詢而頭疼 什么uid 礼烈、tuid 、 suid ....后來使用唯一識別id后大大減輕了這種負擔(dān)婆跑。
1.用戶唯一識別id
2.多商家時 產(chǎn)品唯一識別id
3.訂單號
4.多表時的唯一識別id
還有很多不做一一列舉...
三此熬、使用方法
在Laravel的根目錄中執(zhí)行:
composer require ramsey/uuid
最簡單直接的引入方法
// 命名空間
use Ramsey\Uuid\Uuid;
$data = Uuid::uuid1();
$str = $data->getHex(); //32位字符串方法
dd($str);
那么他可以獲取多少種數(shù)據(jù)類型呢?Uuid獲取出來是這樣的
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,
),
里面的各種長度可以自定義獲取滑进。另外Uuid的靜態(tài)方法有多少呢犀忱?在底部簡主會引入原文作者的筆記,方法很多扶关,到目前為止我都沒有用完阴汇。 但是簡主經(jīng)常用的就是:
$data = Uuid::uuid1();
$data = Uuid::uuid2();
$data = Uuid::uuid3();
$data = Uuid::uuid4();
//括號里面也可以根據(jù)具體業(yè)務(wù)添加參數(shù)
$data = Uuid::uuid1('123123123');
$data = Uuid::uuid1(time());
...
...
如果用在用戶身上,基本上每個用戶從注冊開始就相當(dāng)于綁定了一個身份證(形容是不是很形象)
下面引入原文作者ramsey的原文筆記鏈接 大概快1900行的代碼筆記节槐。
原文筆記