Éviter la duplication des noms de fichiers
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; } }?>
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);?>
Sortie :
8b1a9953c4611296a827abf8c47804d7
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);?>
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")); ?>
Le résultat de sortie est :
string(13) “51734aa562254″ string(14) “a51734aa562257″
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.
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; }
Sortie :
29832412631099013
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 = ''; $chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz'; $max = strlen($chars) - 1; PHP_VERSION < '4.2.0' && 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 < '4.2.0' ? mt_srand((double)microtime() * 1000000) : mt_srand(); $seed = base_convert(md5(print_r($_SERVER, 1).microtime()), 16, $numeric ? 10 : 35); $seed = $numeric ? (str_replace('0', '', $seed).'012340567890') : ($seed.'zZ'.strtoupper($seed)); $hash = ''; $max = strlen($seed) - 1; for($i = 0; $i < $length; $i++) { $hash .= $seed[mt_rand(0, $max)]; } return $hash; }?>
Idée : identifiant + secondes + nombre aléatoire. Parmi eux, "userid+second" est converti de décimal à 64, réduisant le nombre de chiffres
Explication :
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" ;
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位
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.
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!