小編給大家分享一下php如何生成字符串唯一不重復,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
創(chuàng)新互聯(lián)長期為超過千家客戶提供的網(wǎng)站建設(shè)服務,團隊從業(yè)經(jīng)驗10年,關(guān)注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務;打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為柴桑企業(yè)提供專業(yè)的成都網(wǎng)站設(shè)計、做網(wǎng)站,柴桑網(wǎng)站改版等技術(shù)服務。擁有10年豐富建站經(jīng)驗和眾多成功案例,為您定制開發(fā)。
php生成字符串唯一不重復的方法:1、當前時間戳進行md5加密,截取前6位;2、使用數(shù)據(jù)庫bigint自增字段,轉(zhuǎn)成62進制縮短長度。
本文操作環(huán)境:windows7系統(tǒng)、PHP7.1版,DELL G3電腦
PHP怎么生成6位的不重復的字符串?
PHP生成6位的不重復的字符串(類似 UUID)
我們要考慮到:
【 不建議使用啥敏感的數(shù)據(jù)作為訂單生成規(guī)則(例如:用戶UID,訂單自增ORDER_ID等),以為會暴露網(wǎng)站一些敏感信息】
3、不能使用大規(guī)模隨機碼。
why?
首先問你"編程語言中的隨機能做到真隨機嗎?",我可以不自信的告訴你至少PHP做不到,所以可能導致第一個"不重復"原則發(fā)生
如果你的訂單數(shù)量到達了1000w次,你每次生成訂單編碼時就得對比1000w條歷史數(shù)據(jù),一般在500w的時候,你得花時間在數(shù)據(jù)庫優(yōu)化上(簡單處理:采用分區(qū),建立索引,然而實際性要求高,可能需要在主數(shù)據(jù)庫下操作,可想你有多痛,當然對于數(shù)據(jù)庫實時讀寫還有其他的優(yōu)化辦法,在此不作介紹)。
why? 1. 便于查詢檢索 2 位數(shù)控制到 10-20位即可,當然網(wǎng)上將的是10~15緣由是利于輸入,對于輸入太長做好用戶體驗就好(新增復制訂單按鈕)
【當你業(yè)務比較龐大時候,或者后期有大規(guī)模的擴充時,建議考慮下訂單的生成意義,根據(jù)公司的業(yè)務做調(diào)整。舉個最簡單的例子:"一個賣化妝品的商城,你需要根據(jù)訂單來源來(pc/移動)來生成報表,這時候可能需要"】
7.解決辦法
// 類似生成 UUID ,不依賴外部流水號,完全靠時間戳和隨機數(shù)生成訂單號無法避免沖突, // 所以必須引入外部的流水號生成機制?;蚴褂脭?shù)據(jù)庫,或使用APC之類的緩存。 // 用APC之類的緩存存在一個問題,就是無法持久保持數(shù)據(jù),服務器重啟或者PHP宿主進程重啟都會清空流水號計數(shù)器, // 所以可以采取緩存+數(shù)據(jù)庫結(jié)合的模式——如果緩存中有流水號計數(shù)器數(shù)據(jù)則讀取并累加計數(shù),如果緩存中沒有流水號計數(shù)器從數(shù)據(jù)庫中還原計數(shù)器。 // 計數(shù)器可以每隔一段時間重置一次。既然引入了自增流水號計數(shù)器,又會導致文章開頭的“德國坦克問題”, // 所以需要用skip32算法把流水號加密 // (https://github.com/nlenepveu/Skip32)。 // 訂單號 = 日期前綴 + 加密流水號 // Skip32 算法加密密鑰 const ENCRYPTED_KEY = 'xxxxxxxxxxxx'; // 使用 Wincache 作為流水號計數(shù)器緩存 function getOrderSerialNumber() { $timestamp = time(); $datePrefix = date('ymd', $timestamp); // 如果流水號計數(shù)器數(shù)據(jù)不在緩存中,則嘗試從數(shù)據(jù)庫中恢復 if (false === ($value = wincache_ucache_inc($datePrefix))) { wincache_lock($datePrefix); // 從數(shù)據(jù)庫中獲取今日的訂單數(shù) $counter = getNumberOfOrdersTodayFromDatabase($timestamp); $value = $counter + 1; if (!wincache_ucache_add($datePrefix, $value, 60*60*24)) { $value = wincache_ucache_inc($datePrefix); } 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.使用數(shù)據(jù)庫bigint自增字段,轉(zhuǎn)成62進制縮短長度
echo gmp_strval(gmp_init('9876543210', 10), 62);
以上是“php如何生成字符串唯一不重復”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學習更多知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!
當前名稱:php如何生成字符串唯一不重復
文章來源:http://chinadenli.net/article36/joeipg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供Google、動態(tài)網(wǎng)站、企業(yè)網(wǎng)站制作、網(wǎng)站設(shè)計、網(wǎng)站收錄、網(wǎng)站維護
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)