Maison >développement back-end >Problème PHP >Comment générer une chaîne non répétitive à 6 chiffres en php
Comment générer une chaîne non répétitive à 6 chiffres en PHP : 1. Interceptez les 6 premiers chiffres via "substr(md5(microtime(true)), 0, 6);" 2. Utilisez la base de données bigint pour auto -incrémentez le champ et convertissez-le en Raccourcissez simplement la longueur au format hexadécimal.
L'environnement d'exploitation de cet article : système Windows 7, PHP version 7.1, ordinateur DELL G3
Comment PHP génère-t-il une chaîne non répétitive à 6 chiffres
PHP génère une chaîne non répétitive à 6 chiffres ? -chaîne répétitive (similaire à l'UUID)
Nous devons considérer :
1.
2. Sécurité.
【Il n'est pas recommandé d'utiliser des données sensibles comme règles de génération de commandes (par exemple : UID utilisateur, incrémentation automatique de la commande ORDER_ID, etc.), pensant que cela exposera certaines informations sensibles du site Web】
3. les codes aléatoires d’échelle ne peuvent pas être utilisés.
pourquoi ?
Tout d'abord, je vous demande "Le hasard dans un langage de programmation peut-il être vraiment aléatoire ?", je peux vous dire sans certitude qu'au moins PHP ne peut pas le faire, donc cela peut conduire au premier "pas de répétition "Principe
Si la quantité de votre commande atteint 10 millions de fois, vous devrez comparer 10 millions de données historiques à chaque fois que vous générez un code de commande. Généralement, lorsqu'elle atteint 5 millions, vous devrez consacrer du temps à l'optimisation de la base de données ( traitement simple : utiliser le partitionnement, créer des index, Cependant, les exigences pratiques sont élevées et il faudra peut-être l'utiliser sous la base de données principale. Je me demande à quel point cela est pénible pour vous. Bien sûr, il existe d'autres méthodes d'optimisation en temps réel. lecture et écriture de la base de données, qui ne seront pas présentées ici).
4. Empêcher la concurrence.
5. Nombre de chiffres de contrôle.
pourquoi ?
Pratique pour l'interrogation et la récupération
Le nombre de chiffres peut être contrôlé entre 10 et 20. Bien sûr, le nombre sur Internet est de 10 à 15 car il est pratique pour la saisie si la saisie est trop longue. , fournissez simplement un bouton de bonne expérience utilisateur (commande de copie ajoutée))
6. Essayez d'avoir une importance commerciale (pas obligatoire, en fonction de l'activité de l'entreprise)
[Lorsque votre entreprise est relativement grande, ou qu'elle sera grande. -expansion à grande échelle à l'avenir, il est recommandé de considérer l'importance de passer une commande en fonction de l'activité de l'entreprise. Prenons l'exemple le plus simple : "Un centre commercial vendant des cosmétiques, vous devez générer des rapports en fonction de la source de la commande (pc/mobile), cela peut être nécessaire"]
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); }
De manière simple :
1 .Le courant. L'horodatage est crypté en md5 et les 6 premiers chiffres sont interceptés
echo substr(md5(microtime(true)), 0, 6);
2. Utilisez la base de données bigint pour incrémenter automatiquement le champ et convertissez-le en 62 pour raccourcir la longueur
echo gmp_strval(gmp_init('9876543210', 10), 62);
Apprentissage recommandé : "Tutoriel vidéo PHP"
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!