首頁  >  文章  >  後端開發  >  php怎麼產生6位元不重複的字串

php怎麼產生6位元不重複的字串

藏色散人
藏色散人原創
2021-11-03 10:58:483257瀏覽

php產生6位元不重複的字串的方法:1、透過「substr(md5(microtime(true)), 0, 6);」截取前6位元;2、使用資料庫bigint自增字段,轉成62進制縮短長度即可。

php怎麼產生6位元不重複的字串

本文操作環境:windows7系統、PHP7.1版、DELL G3電腦

php怎麼產生6位元不重複的字串?

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

我們要考慮到:

##1、不重複。

2、安全性。

【 不建議使用啥敏感的資料作為訂單產生規則(例如:用戶UID,訂單自增ORDER_ID等),以為會暴露網站一些敏感資訊】

3、不能使用大規模隨機碼。

why?

首先問你"程式語言中的隨機能做到真隨機嗎?",我可以不自信的告訴你至少PHP做不到,所以可能導致第一個"不重複"原則發生

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

4、防止並發。

5、控制位數。

why?

  • 方便查詢檢索

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

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

【當你業務比較龐大時候,或是後期有大規模的擴充時,建議考慮下訂單的生成意義,根據公司的業務做調整。舉個最簡單的例子:"一個賣化妝品的商城,你需要根據訂單來源來(pc/移動)來產生報表,這時候可能需要"】

7.解決辦法

// 类似生成 UUID ,不依赖外部流水号,完全靠时间戳和随机数生成订单号无法避免冲突,
// 所以必须引入外部的流水号生成机制。或使用数据库,或使用APC之类的缓存。
// 用APC之类的缓存存在一个问题,就是无法持久保持数据,服务器重启或者PHP宿主进程重启都会清空流水号计数器,
// 所以可以采取缓存+数据库结合的模式——如果缓存中有流水号计数器数据则读取并累加计数,如果缓存中没有流水号计数器从数据库中还原计数器。
// 计数器可以每隔一段时间重置一次。既然引入了自增流水号计数器,又会导致文章开头的“德国坦克问题”,
// 所以需要用skip32算法把流水号加密
// (https://github.com/nlenepveu/Skip32)。
// 订单号 = 日期前缀 + 加密流水号
// Skip32 算法加密密钥
const ENCRYPTED_KEY = 'xxxxxxxxxxxx';
// 使用 Wincache 作为流水号计数器缓存
function getOrderSerialNumber() {
    $timestamp = time();
    $datePrefix = date('ymd', $timestamp);
// 如果流水号计数器数据不在缓存中,则尝试从数据库中恢复
    if (false === ($value = wincache_ucache_inc($datePrefix))) {
    wincache_lock($datePrefix);
// 从数据库中获取今日的订单数
    $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.使用資料庫bigint自增字段,轉成62進位縮短長度

echo gmp_strval(gmp_init('9876543210', 10), 62);

推薦學習:《

PHP影片教學

以上是php怎麼產生6位元不重複的字串的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn