How to generate a 6-digit non-repeating string in php: 1. Intercept the first 6 digits through "substr(md5(microtime(true)), 0, 6);"; 2. Use database bigint to auto-increment Field, just convert it to hexadecimal and shorten the length.
The operating environment of this article: windows7 system, PHP7.1 version, DELL G3 computer
How to generate 6-digit non-duplicate php String?
PHP generates a 6-digit non-repeating string (similar to UUID)
We must consider:
1. No duplication.
2. Security.
【It is not recommended to use sensitive data as order generation rules (for example: user UID, order auto-increment ORDER_ID, etc.), thinking that it will expose some sensitive information of the website】
3. Do not use large Scale random code.
why?
First of all, I ask you, "Can randomness in a programming language be truly random?" I can tell you without confidence that at least PHP can't do it, so it may lead to the first A "no duplication" principle occurs
If your order quantity reaches 10 million times, you have to compare 10 million pieces of historical data every time you generate an order code. Generally, when it reaches 5 million, you have to spend time in the database Optimization (simple processing: use partitioning and create indexes. However, the practical requirements are high and may need to be operated under the main database. I wonder how painful it is for you. Of course, there are other optimization methods for real-time reading and writing of the database, which will not be introduced here. ).
4. Prevent concurrency.
5. Number of control digits.
why?
Easy to query and search
The number of digits can be controlled to 10-20. Of course, the number on the Internet is 10~15 because it is convenient for input , if the input is too long, just improve the user experience (add a copy order button)
6. Try to have business significance (not mandatory, based on the company's business)
[When your business is relatively large, or there is a large-scale expansion in the later period, it is recommended to consider the significance of placing an order and make adjustments according to the company's business. Take the simplest example: "For a mall that sells cosmetics, you need to generate reports based on the order source (pc/mobile). At this time, you may need"]
7. Solution
// 类似生成 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); }
Simple way:
1. The current timestamp is md5 encrypted and the first 6 digits are intercepted
echo substr(md5(microtime(true)), 0, 6);
2. Use the database bigint to auto-increment the field and convert it to 62 to shorten the length
echo gmp_strval(gmp_init('9876543210', 10), 62);
Recommended learning: "PHP Video Tutorial"
The above is the detailed content of How to generate a 6-digit non-repeating string in php. For more information, please follow other related articles on the PHP Chinese website!