Rumah >pembangunan bahagian belakang >masalah PHP >Bagaimana untuk menjana rentetan tidak berulang 6 digit dalam php
Cara menjana rentetan tidak berulang 6 digit dalam PHP: 1. Minta 6 digit pertama melalui "substr(md5(microtime(true)), 0, 6);" 2. Gunakan pangkalan data bigint kepada Auto-increment Field, cuma tukarkannya kepada heksadesimal dan pendekkan panjangnya.
Persekitaran pengendalian artikel ini: sistem Windows 7, PHP versi 7.1, komputer DELL G3
Cara menjana 6- digit aksara tidak berulang dalam php String?
PHP menjana 6 digit rentetan tidak berulang (serupa dengan UUID)
Kita perlu mempertimbangkan:
1. Tiada pertindihan.
2.
【Adalah tidak digalakkan untuk menggunakan data sensitif sebagai peraturan penjanaan pesanan (contohnya: UID pengguna, pesanan auto-kenaikan ORDER_ID, dll.), memikirkan bahawa ia akan mendedahkan beberapa maklumat sensitif tapak web】
3. Jangan gunakan kod rawak Saiz besar.
kenapa?
Pertama sekali, saya bertanya kepada anda "Bolehkah rawak dalam bahasa pengaturcaraan benar-benar rawak?", Saya boleh memberitahu anda tanpa yakin bahawa sekurang-kurangnya PHP tidak boleh melakukannya, jadi ia mungkin membawa kepada prinsip "tiada pertindihan" yang pertama berlaku
Jika kuantiti pesanan anda mencapai 10 juta kali, anda perlu membandingkan 10 juta keping data sejarah setiap kali anda menjana kod pesanan Secara umumnya, apabila ia mencapai 5 juta, anda perlu menghabiskan masa dalam Pengoptimuman pangkalan data (pemprosesan mudah: gunakan pembahagian dan buat indeks. Walau bagaimanapun, keperluan praktikal adalah tinggi dan mungkin perlu dikendalikan di bawah pangkalan data utama. Saya tertanya-tanya betapa menyakitkannya untuk anda . Sudah tentu, terdapat kaedah pengoptimuman lain untuk membaca dan menulis pangkalan data masa nyata, yang tidak akan diperkenalkan di sini ).
4.
5 digit.
kenapa?
Mudah untuk pertanyaan dan mendapatkan semula
Bilangan digit boleh dikawal hingga 10-20 Sudah tentu, nombor di Internet adalah 10~15 kerana ia mudah untuk input , jika input terlalu panjang, cuma perbaiki pengalaman pengguna (tambah butang pesanan salinan)
6. Cuba fahami perniagaan (bukan mandatori, berdasarkan perniagaan syarikat)
【Apabila perniagaan anda agak besar, atau akan ada pengembangan berskala besar pada masa hadapan, adalah disyorkan untuk mempertimbangkan kepentingan membuat pesanan dan membuat pelarasan mengikut perniagaan syarikat. Ambil contoh paling mudah: "Pusat membeli-belah yang menjual kosmetik, anda perlu menjana laporan berdasarkan sumber pesanan (pc/mudah alih), ini mungkin perlu"]
7 >Kaedah mudah:
// 类似生成 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 Sulitkan cap masa semasa dengan md5 dan memintas 6 digit pertama
2 untuk memendekkan panjang
echo substr(md5(microtime(true)), 0, 6);
Pembelajaran yang disyorkan: "
Tutorial Video PHPecho gmp_strval(gmp_init('9876543210', 10), 62);"
Atas ialah kandungan terperinci Bagaimana untuk menjana rentetan tidak berulang 6 digit dalam php. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!