PHP生成6位的不重複的字串(類似 UUID)

2021-10-06 17:26:34 字數 1646 閱讀 9629

我們要考慮到:

1、不重複。

2、安全性。

【 不建議使用啥敏感的資料作為訂單生成規則(例如:使用者uid,訂單自增order_id等),以為會暴露**一些敏感資訊】
3、不能使用大規模隨機碼。
why?
首先問你"程式語言中的隨機能做到真隨機嗎?",我可以不自信的告訴你至少php做不到,所以可能導致第乙個"不重複"原則發生

如果你的訂單數量到達了1000w次,你每次生成訂單編碼時就得對比1000w條歷史資料,一般在500w的時候,你得花時間在資料庫優化上(簡單處理:採用分割槽,建立索引,然而實際性要求高,可能需要在主資料庫下操作,可想你有多痛,當然對於資料庫實時讀寫還有其他的優化辦法,在此不作介紹)。

4、防止併發。

5、控制位數。

why?

1. 便於查詢檢索

2 位數控制到 10-20位即可,當然網上將的是10~15緣由是利於輸入,對於輸入太長做好使用者體驗就好(新增複製訂單按鈕)

6、盡量具有業務意義(不是強制的,根據公司業務來)
【當你業務比較龐大時候,或者後期有大規模的擴充時,建議考慮下訂單的生成意義,根據公司的業務做調整。舉個最簡單的例子:"乙個賣化妝品的**,你需要根據訂單**來(pc/移動)來生成報表,這時候可能需要"】
7.解決辦法
// 類似生成 uuid ,不依賴外部流水號,完全靠時間戳和隨機數生成訂單號無法避免衝突,

// 所以必須引入外部的流水號生成機制。或使用資料庫,或使用apc之類的快取。

// 用apc之類的快取存在乙個問題,就是無法持久保持資料,伺服器重啟或者php宿主程序重啟都會清空流水號計數器,

// 所以可以採取快取+資料庫結合的模式——如果快取中有流水號計數器資料則讀取並累加計數,如果快取中沒有流水號計數器從資料庫中還原計數器。

// 計數器可以每隔一段時間重置一次。既然引入了自增流水號計數器,又會導致文章開頭的「德國坦克問題」,

// 所以需要用skip32演算法把流水號加密

// (

// 訂單號 = 日期字首 + 加密流水號

// skip32 演算法加密金鑰

const encrypted_key = '************';

// 使用 wincache 作為流水號計數器快取

function getorderserialnumber()

wincache_unlock($dateprefix);

} return $dateprefix.str_pad(skip32::encrypt($dateprefix.encrypted_key, $value), 10, '0', str_pad_left);

}

1.當前時間戳md5加密,擷取前6位

echo

substr

(md5

(microtime

(true))

,0,6

);

2.使用資料庫bigint自增字段,轉成62進製縮短長度

echo

gmp_strval

(gmp_init

('9876543210',10

),62)

;

生成4位不重複的字串

實際的業務場景中需要生成4位不重複的字串,這個場景比較特殊,不具有普遍性,正常場景的唯一單號都不會只有4位。最先想到的是隨機生成4位字串,字元包括數字 大小寫字母一共62位,基本可以滿足使用要求,但是越到後面,重複的概率就會越大。想要保證不重複,可以加入時間戳,機器id等,類似雪花演算法的思路,但是...

生成不重複12位隨機字串

1.生成乙個12位隨機不重複純數字字串 public static string couponcode return first string.format 010d rnd 2.生成乙個以自定義字串開頭的不重複隨機字串 public static string couponcode string ...

50萬資料生成6位數不重複字串 資料完整性

資料完整性完整性是指在傳輸 儲存資訊或資料的過程中,確保資訊或資料不被未授權的篡改或在篡改後能夠被迅速發現。許多開放的系統應用都有依賴於資料完整性的安全需求。雜湊函式hash 實現資料的完整性保護可以採用雜湊函式hash演算法 雜湊函式 英語 hash function 又稱雜湊演算法 雜湊函式,是...