我們要考慮到:
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 又稱雜湊演算法 雜湊函式,是...