Comment générer des identifiants uniques en PHP

小云云
Libérer: 2023-03-22 06:22:01
original
2401 Les gens l'ont consulté


Identifiant (IDentifier) ​​​​fait référence à un symbole utilisé pour identifier une entité. Il a différentes significations selon les environnements d’application. Cet article vous explique principalement comment générer des identifiants uniques en PHP. J'espère qu'il pourra vous aider.

1. Scénarios applicables

Éviter la duplication des noms de fichiers

2. Solution conventionnelle

Guid 2.1

Numéro système hexadécimal à 32 caractères .
Format : le GUID est au format "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", où chaque x est un nombre hexadécimal de 32 chiffres compris entre 0 et 9 ou a-f. Par exemple : 6F9619FF-8B86-D011-B42D-00C04FC964FF est une valeur GUID valide.

Avantages : Presque aucune répétition ;
Inconvénients : C'est encore trop long pour renommer les photos téléchargées.

Utilisation :

<?php/*
com_create_guid()是php5版本支持的功能,对于不支持的版本,可以自己进行定义;
*/function guid(){
 if (function_exists(‘com_create_guid’)){ return com_create_guid();
 }else{
 mt_srand((double)microtime()*10000);// optional for php 4.2.0 and up.
 echo(mt_rand()); $charid = strtoupper(md5(uniqid(rand(), true))); $hyphen = chr(45);// “-”
 $uuid = chr(123)// “{”
 .substr($charid, 0, 8).$hyphen
 .substr($charid, 8, 4).$hyphen
 .substr($charid,12, 4).$hyphen
 .substr($charid,16, 4).$hyphen
 .substr($charid,20,12)
 .chr(125);// “}”
 return $uuid;
 }
}?>
Copier après la connexion

2.2 MD5

affichera le même nombre hexadécimal de 32 caractères que guid. La différence est que guid est généré de manière aléatoire et md5 doit le faire. être saisi en fonction de la génération des données d’entrée.

< ?php$str = "Hello";echo md5($str);?>
Copier après la connexion

Sortie :

8b1a9953c4611296a827abf8c47804d7
Copier après la connexion

Avantages : La valeur de sortie peut être contrôlée en fonction des données de départ d'entrée. Si les données de départ sont régulières et non répétitives, les données peuvent être. traité via la protection md5, créant une grande confusion.

Inconvénients : les caractères 32 bits sont trop longs ; des données de départ non dupliquées doivent être fournies ; une simultanéité élevée, avec des secondes comme données de départ, une duplication se produira toujours.

Utilisation :

< ?php/*
*结合time()函数使用,以1970年到当前时间的秒数作为种子数。
*/$str=time();echo md5($str);?>
Copier après la connexion

2.3 uniqid()

Renvoie une chaîne de 13 ou 23 bits.
Pour nos besoins, uniqid() est comme une version améliorée de md5(), d'autant plus que nous pouvons utiliser des identifiants différentiels comme préfixes de chaîne pour réduire le risque de dénomination répétée.

Pour les situations extrêmes telles qu'une concurrence non élevée, il est recommandé d'utiliser cette fonction, qui peut déjà répondre à des besoins généraux.
Définition : La fonction uniqid() génère un identifiant unique basé sur l'heure actuelle en microsecondes.
Utilisation : uniqid(prefix,more_entropy)
Explication : prefix peut ajouter un préfixe à la chaîne de sortie L'exemple est le suivant Lorsque le paramètre more_entropy est vrai, une chaîne de 23 bits sera générée.

< ?phpvar_dump(uniqid());var_dump(uniqid("a"));
?>
Copier après la connexion

Le résultat de sortie est :

string(13) “51734aa562254″ string(14) “a51734aa562257″
Copier après la connexion

Avantages : une longueur de chaîne de 13 chiffres est une longueur de nom de fichier acceptable, des préfixes peuvent être ajoutés et le résultat contient une confusion de données, ce qui entraîne une certaine confusion dans les données ; peut éviter les réactions négatives. Poussez les données brutes.

Inconvénients : semblable à md5, concurrence élevée, utilisant les secondes comme données de départ, la duplication se produira toujours.

3. Plan de version améliorée

3.1 fast_uuid : renvoie un numéro à 17 chiffres

C'est un peu comme une version personnalisée incomplète d'uniqid(). " qui apparaît dans cette fonction. La notion de " temps " est très éclairante.
L'heure par défaut utilisée dans time() et uniqid() est calculée à partir de 1970, et la longueur est de dix chiffres (1366512439). L'utilisation de "l'heure de début du numéro de départ" peut réduire cette valeur, car nous en avons réellement besoin. est juste une valeur qui peut croître automatiquement.
Après avoir personnalisé l'heure de départ, en plus de réduire la durée, cela peut aussi jouer un rôle dans la confusion.

/*
* 参数 suffix_len指定 生成的 ID 值附加多少位随机数,默认值为 3。
* 感谢“Ivan Tan|谭俊青 DrinChing (at) Gmail.com”提供的算法。
* @param int suffix_len
* @return string*/function fast_uuid($suffix_len=3){ //! 计算种子数的开始时间 $being_timestamp = strtotime(’2013-3-21′); $time = explode(‘ ‘, microtime()); $id = ($time[1] – $being_timestamp) . sprintf(‘%06u’, substr($time[0], 2, 6)); if ($suffix_len > 0)
 { $id .= substr(sprintf(‘%010u’, mt_rand()), 0, $suffix_len);
 } return $id;
}
Copier après la connexion

Sortie :

29832412631099013
Copier après la connexion

3.2 time()+nombre aléatoire

L'utilisation de nombres aléatoires est déjà apparue dans l'exemple ci-dessus, afin de résoudre le problème d'une seconde Plusieurs demandes se sont produites. Deux fonctions sont fournies comme suit,

< ?phpfunction random($length) {
 $hash = &#39;&#39;; $chars = &#39;ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz&#39;; $max = strlen($chars) - 1;
 PHP_VERSION < &#39;4.2.0&#39; && mt_srand((double)microtime() * 1000000); for($i = 0; $i < $length; $i++) { $hash .= $chars[mt_rand(0, $max)];
 } return $hash;
}function random2($length, $numeric = 0) {
 PHP_VERSION < &#39;4.2.0&#39; ? mt_srand((double)microtime() * 1000000) : mt_srand(); $seed = base_convert(md5(print_r($_SERVER, 1).microtime()), 16, $numeric ? 10 : 35); $seed = $numeric ? (str_replace(&#39;0&#39;, &#39;&#39;, $seed).&#39;012340567890&#39;) : ($seed.&#39;zZ&#39;.strtoupper($seed)); $hash = &#39;&#39;; $max = strlen($seed) - 1; for($i = 0; $i < $length; $i++) { $hash .= $seed[mt_rand(0, $max)];
 } return $hash;
}?>
Copier après la connexion

4. La solution finale

Idée : identifiant + secondes + nombre aléatoire. Parmi eux, "userid+second" est converti de décimal à 64, réduisant le nombre de chiffres

Explication :

  1. userid : maximum ; la valeur en 64 "ZZZZ" convertie en décimal est égale à "16777215", et la valeur maximale de "ZZZ" convertie en décimal est égale à "262143" ;

  2. Secondes : définissez votre propre point de départ de l'heure ; .

$less=time()-strtotime(’2012-4-21′); 转换为64进制”1SpRe“,5位$less=time()-strtotime(’2013-3-21′); 转换为64进制”_jHY“;4位
Copier après la connexion
  1. Nombre aléatoire : utilisez random(3) pour générer un nombre aléatoire à 3 chiffres

Résultat final :
ID utilisateur à 4 chiffres + seconde à 4 chiffres + nombre aléatoire à 3 chiffres = chaîne de 11 chiffres. Bien que les résultats ressemblent à ceux d’uniqid(), la robustesse est améliorée.

5. Résumé

Cet article implique plusieurs méthodes qui peuvent être utilisées pour renommer les images téléchargées. Le point clé est d'utiliser le décimal en hexadécimal pour réduire la chaîne.

Par exemple, le nombre à 17 chiffres généré par fast_uuid est converti en hexadécimal avec seulement 7 caractères
L'utilisation spécifique peut être utilisée de manière flexible en fonction de votre propre situation. J'espère que cela sera utile à tout le monde. .

Recommandations associées :

Comment implémenter correctement PHP pour générer des identifiants uniques

Quelques règles pour les identifiants de variables PHP

Comment générer des identifiants uniques en 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:
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
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!