一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - PHP教程 - php生成唯一uid的解決方法詳解

php生成唯一uid的解決方法詳解

2021-11-29 15:26autofelix PHP教程

在用戶系統中,生成唯一uid,是很多初級程序員頭痛的事情,因為你并不能保證完全的唯一性,如果要保證唯一性,必須要查一次數據庫。本文將介紹php生成唯一uid的思路,希望能對大家有所幫助

一、生成唯一uuid

看到某些人會用uuid去代替用戶的uid

從代碼中可以看出,通過unique生成一個以毫秒級時間戳為前綴的字符后md5加密

再通過分隔符進行分割后得到uuid

這種方式雖然極大程度的避免了uid的重復

但是生成的uid太長,足足36個字符,而且是混雜英文和數字符號的,可讀性很差

而一般的uid中都是純數值組成的

?
1
2
3
4
5
6
7
8
9
10
<?php
function generateUUid($strtoupper = false)
{
    $charid = call_user_func($strtoupper ? 'strtoupper' : 'strtolower', md5(uniqid(microtime(true), true)));
    $hyphen = chr(45);
    $uuid = substr($charid, 0, 8) . $hyphen . substr($charid, 8, 4) . $hyphen . substr($charid, 12, 4) . $hyphen . substr($charid, 16, 4) . $hyphen . substr($charid, 20, 12);
    return $uuid;
}
 
//結果:37f14a07-cb18-2e54-4e40-da1e2fa0456d

二、生成唯一uid

由于一般正常的uid都是純數值型的

而要保證唯一性,必然要跟時間戳有關系,因此有了以下代碼

為了盡可能的在同一秒中注冊人數的uid不同,將時間戳進行打亂隨機排序,也不失為一個好辦法

但是這種缺點就是,uid長度是固定的,無法進行改變,雖然呢,打亂字符是一個很好的解決重復的方式

但是事情無絕對,如果真的因為隨機碰撞導致的uid相同該如何

為了更保險起見,必然還是要走一次數據庫的查詢

大大增加了數據庫的I/O壓力

?
1
2
3
4
5
6
7
<?php
function generateUid()
{
    return call_user_func('str_shuffle', time());
}
 
//結果:4067524162

三、生成唯一uid的正確方法

雖然說上面的兩種方式并非不可取

但是在大型公司必然不可取,一種是uid的格式必然純數值,所以uuid方式可以排除

另外由于對數據庫的壓力起見,必然也不會采用第二種方式

而最經常采用的方式應該是使用數據庫的主鍵索引,因為主鍵索引必然唯一

這里很多人會疑惑,主鍵索引不是會從1開始嗎,這uid會有1位數的?

小了,格局小了,你可以設置主鍵索引的offset,讓他從100000開始,不就可以解決這個問題了嗎

這時候有人又問,那主鍵索引增加不是有規律的嗎,比如插一條,會自增1

這時候就可以設置主鍵索引的增長步長,讓他插入一條的步長不為1即可

而為了讓uid看起來更加沒有關聯性,你可以設置步長為基數,比如3

這樣增長起來,就會是100000,100003,100006,100009,100012....

php生成唯一uid的解決方法詳解

補充

php中生成標準uuid的方法

UUID是指在一臺機器上生成的數字,它保證對在同一時空中的所有機器都是唯一的。

通常平臺 會提供生成UUID的API。UUID按照開放軟件基金會(OSF)制定的標準計算,用到了以太網卡地址、納秒級時間、芯片ID碼和許多可能的數字。

由以 下幾部分的組合:當前日期和時間(UUID的第一個部分與時間有關,如果你在生成一個UUID之后,過幾秒又生成一個UUID,則第一個部分不同,其余相 同),時鐘序列,全局唯一的IEEE機器識別號(如果有網卡,從網卡獲得,沒有網卡以其他方式獲得),UUID的唯一缺陷在于生成的結果串會比較長。

關于 UUID這個標準使用最普遍的是微軟的GUID(Globals Unique Identifiers)。

在ColdFusion中可以用CreateUUID()函數很簡單的生成UUID,其格式為:xxxxxxxx-xxxx-xxxx- xxxxxxxxxxxxxxxx(8-4-4-16),其中每個 x 是 0-9 或 a-f 范圍內的一個十六進制的數字。

而標準的UUID格式為:xxxxxxxx-xxxx-xxxx-xxxxxx-xxxxxxxxxx (8-4-4-4-12)

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
 
function guid(){
 if (function_exists('com_create_guid')){
  return com_create_guid();
 }else{
  mt_srand((double)microtime()*10000);//optional for php 4.2.0 and up.
  $charid = strtoupper(md5(uniqid(rand(), true)));
  $hyphen = chr(45);// "-"
  $uuid = chr(123)// "{"
    .substr($charid, 0, 8).$hyphen
    .substr($charid, 8, 4).$hyphen
    .substr($charid,12, 4).$hyphen
    .substr($charid,16, 4).$hyphen
    .substr($charid,20,12)
    .chr(125);// "}"
  return $uuid;
 }
}
echo guid();
?>

到此這篇關于php生成唯一uid的解決方法詳解的文章就介紹到這了,更多相關php內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://autofelix.blog.csdn.net/article/details/118036252

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产综合成人久久大片91 | 男人的天堂va| 精品suv一区二区三区 | 午夜国产福利视频一区 | 精品一区二区三区色花堂 | 香蕉久久一区二区不卡无毒影院 | 网红刘婷hd国产高清 | 草嫩社区 | 成人先锋 | 欧美娇小性xxxx | 人人干国产 | 成人欧美1314www色视频 | 久久视频这里只精品99热在线观看 | 波多野结衣中文字幕在线 | xxxx泡妞中国| 奇米影视在线视频 | 香蕉tv亚洲专区在线观看 | 国产第一福利视频导航在线 | 欧美兽皇video| 久久受www免费人成_看片中文 | 大香人蕉免费视频75 | 无遮18禁在线永久免费观看挡 | 双龙高h | 日韩精品成人a在线观看 | 红色一片在线影视 | а天堂中文最新版在线官网视频 | 欧美日韩国产成人综合在线 | 好逼天天有 | 26uuu老色哥| 日本在线播放 | 日本肥熟 | 亚洲国产无线码在线观看 | 亚洲经典 | 亚洲欧美精品一区天堂久久 | 国产成人精品高清在线观看99 | 7mav视频| 大象传媒免费网址 | 高h短篇校园1v1 | 贰佰麻豆剧果冻传媒一二三区 | 国产草草视频 | 秋霞午夜伦午夜高清福利片 |