溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

php如何生成6位不重復(fù)的字符串

發(fā)布時間:2021-11-03 11:01:24 來源:億速云 閱讀:366 作者:iii 欄目:編程語言

本篇內(nèi)容介紹了“php如何生成6位不重復(fù)的字符串”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細閱讀,能夠?qū)W有所成!

php生成6位不重復(fù)的字符串的方法:1、通過“substr(md5(microtime(true)), 0, 6);”截取前6位;2、使用數(shù)據(jù)庫bigint自增字段,轉(zhuǎn)成62進制縮短長度即可。

php如何生成6位不重復(fù)的字符串

本文操作環(huán)境:windows7系統(tǒng)、PHP7.1版、DELL G3電腦

php怎么生成6位不重復(fù)的字符串?

PHP生成6位的不重復(fù)的字符串(類似 UUID)

我們要考慮到:

1、不重復(fù)。

2、安全性。

【 不建議使用啥敏感的數(shù)據(jù)作為訂單生成規(guī)則(例如:用戶UID,訂單自增ORDER_ID等),以為會暴露網(wǎng)站一些敏感信息】

3、不能使用大規(guī)模隨機碼。

why?

首先問你"編程語言中的隨機能做到真隨機嗎?",我可以不自信的告訴你至少PHP做不到,所以可能導(dǎo)致第一個"不重復(fù)"原則發(fā)生

如果你的訂單數(shù)量到達了1000w次,你每次生成訂單編碼時就得對比1000w條歷史數(shù)據(jù),一般在500w的時候,你得花時間在數(shù)據(jù)庫優(yōu)化上(簡單處理:采用分區(qū),建立索引,然而實際性要求高,可能需要在主數(shù)據(jù)庫下操作,可想你有多痛,當(dāng)然對于數(shù)據(jù)庫實時讀寫還有其他的優(yōu)化辦法,在此不作介紹)。

4、防止并發(fā)。

5、控制位數(shù)。

why?

  • 便于查詢檢索

  • 位數(shù)控制到 10-20位即可,當(dāng)然網(wǎng)上將的是10~15緣由是利于輸入,對于輸入太長做好用戶體驗就好(新增復(fù)制訂單按鈕)

6、盡量具有業(yè)務(wù)意義(不是強制的,根據(jù)公司業(yè)務(wù)來)

【當(dāng)你業(yè)務(wù)比較龐大時候,或者后期有大規(guī)模的擴充時,建議考慮下訂單的生成意義,根據(jù)公司的業(yè)務(wù)做調(diào)整。舉個最簡單的例子:"一個賣化妝品的商城,你需要根據(jù)訂單來源來(pc/移動)來生成報表,這時候可能需要"】

7.解決辦法

// 類似生成 UUID ,不依賴外部流水號,完全靠時間戳和隨機數(shù)生成訂單號無法避免沖突,
// 所以必須引入外部的流水號生成機制?;蚴褂脭?shù)據(jù)庫,或使用APC之類的緩存。
// 用APC之類的緩存存在一個問題,就是無法持久保持數(shù)據(jù),服務(wù)器重啟或者PHP宿主進程重啟都會清空流水號計數(shù)器,
// 所以可以采取緩存+數(shù)據(jù)庫結(jié)合的模式——如果緩存中有流水號計數(shù)器數(shù)據(jù)則讀取并累加計數(shù),如果緩存中沒有流水號計數(shù)器從數(shù)據(jù)庫中還原計數(shù)器。
// 計數(shù)器可以每隔一段時間重置一次。既然引入了自增流水號計數(shù)器,又會導(dǎo)致文章開頭的“德國坦克問題”,
// 所以需要用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ù)庫中恢復(fù)
    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.當(dāng)前時間戳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如何生成6位不重復(fù)的字符串”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

php
AI