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

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

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 欧美一级xxx| 午夜宅男网 | 97视频免费人人观看人人 | 国产成人激情视频 | 青视频在线 | 亚洲视频精选 | 四虎影院免费在线播放 | 国产人人草 | 华人亚洲欧美精品国产 | 日本海鸣馆 | 91精品啪在线观看国产日本 | 国产 国语对白 露脸正在播放 | 亚洲国产精品一区二区久久 | 国产高清一区二区三区免费视频 | 九九国产在线观看 | 国产欧美va欧美va香蕉在线观 | 日本中文字幕一区二区三区不卡 | 狠狠色狠狠色综合日日小蛇 | 国产第2页| 黄在线观看www免费看 | 日本一区二区三区视频在线观看 | 免费视频| 国产传媒天美果冻 | 亚洲mm色国产网站 | 91色爱 | 99久久精品国产一区二区 | 欧美夫妇野外交换hd高清版 | 欧美人shou交在线播放 | 四虎最新免费观看网址 | 久久亚洲午夜牛牛影视 | 99九九精品视频 | 清清草在线视频 | 国产精品露脸国语对白河北 | 国产日韩高清一区二区三区 | 天天插伊人 | 亚洲 综合 欧美在线 热 | 三年片韩国在线观看 | 青青成人福利国产在线视频 | 97成网| 5g影院天天5g天天爽大陆 | 精品人人做人人爽久久久 |