Maison > développement back-end > Problème PHP > Comment générer des chaînes uniques et non répétitives en php

Comment générer des chaînes uniques et non répétitives en php

藏色散人
Libérer: 2023-03-11 08:04:01
original
3482 Les gens l'ont consulté

La seule méthode non répétitive permettant à PHP de générer une chaîne : 1. Cryptez l'horodatage actuel avec md5 et interceptez les 6 premiers chiffres. 2. Utilisez la base de données bigint pour incrémenter automatiquement le champ et convertissez-le en 62 pour raccourcir le champ. longueur.

Comment générer des chaînes uniques et non répétitives en php

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 (similaire à l'UUID)

Nous devons considérer :

1.

2. Sécurité.

【 不建议使用啥敏感的数据作为订单生成规则(例如:用户UID,订单自增ORDER_ID等),以为会暴露网站一些敏感信息】
Copier après la connexion

3. Les codes aléatoires à grande échelle ne peuvent pas être utilisés.

why?
Copier après la connexion
  1. 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 "non principe de répétition"
  2. Si votre quantité de commande atteint 10 millions de fois, vous devez 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 devez consacrer du temps à l'optimisation de la base de données (simple traitement : utilisez le partitionnement et la création d'index, mais 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 pour la lecture en temps réel. écriture de la base de données, qui ne sera pas présentée ici).

4. Empêcher la concurrence.

5. Nombre de chiffres de contrôle.

why?
1. 便于查询检索
2 位数控制到 10-20位即可,当然网上将的是10~15缘由是利于输入,对于输入太长做好用户体验就好(新增复制订单按钮)
Copier après la connexion

6. Essayez d'avoir une signification commerciale (pas obligatoire, selon l'activité de l'entreprise)

【当你业务比较庞大时候,或者后期有大规模的扩充时,建议考虑下订单的生成意义,根据公司的业务做调整。举个最简单的例子:"一个卖化妆品的商城,你需要根据订单来源来(pc/移动)来生成报表,这时候可能需要"】
Copier après la connexion

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);
}
Copier après la connexion

De manière simple :

1. L'horodatage actuel est crypté en md5 et les 6 premiers chiffres. sont interceptés

echo substr(md5(microtime(true)), 0, 6);
Copier après la connexion

2. Utilisez la base de données bigint pour incrémenter automatiquement le champ et convertissez-le en hexadécimal pour raccourcir la longueur

echo gmp_strval(gmp_init('9876543210', 10), 62);
Copier après la connexion

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!

Étiquettes associées:
php
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal