Heim > Backend-Entwicklung > PHP-Tutorial > So generieren Sie eindeutige Bezeichner in PHP

So generieren Sie eindeutige Bezeichner in PHP

小云云
Freigeben: 2023-03-22 06:22:01
Original
2420 Leute haben es durchsucht


Identifier (IDentifier) ​​bezieht sich auf ein Symbol, das zur Identifizierung einer Entität verwendet wird. Es hat in verschiedenen Anwendungsumgebungen unterschiedliche Bedeutungen. In diesem Artikel erfahren Sie hauptsächlich, wie Sie eindeutige Bezeichner in PHP generieren. Ich hoffe, er kann Ihnen helfen.

1. Anwendbare Szenarien

Vermeiden Sie Duplikate von Dateinamen

2. Konventionelle Lösung

2.1 Anleitung

32 Zeichen hexadezimale Systemnummer .
Format: Die GUID hat das Format „xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx“, wobei jedes x eine 32-stellige Hexadezimalzahl im Bereich von 0-9 oder a-f ist. Beispiel: 6F9619FF-8B86-D011-B42D-00C04FC964FF ist ein gültiger GUID-Wert.

Vorteile: Fast keine Wiederholungen;
Nachteile: Das Umbenennen hochgeladener Bilder dauert immer noch zu lange.

Verwendung:

<?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;
 }
}?>
Nach dem Login kopieren

2.2 MD5

gibt dieselbe 32-stellige Hexadezimalzahl wie Guid aus. Der Unterschied besteht darin, dass Guid zufällig generiert wird und MD5 dies tun muss entsprechend der Eingabedatengenerierung eingegeben werden.

< ?php$str = "Hello";echo md5($str);?>
Nach dem Login kopieren

Ausgabe:

8b1a9953c4611296a827abf8c47804d7
Nach dem Login kopieren

Vorteile: Der Ausgabewert kann basierend auf den eingegebenen Seed-Daten gesteuert werden. Wenn die Seed-Daten regelmäßig sind und sich nicht wiederholen, können die Daten sein durch den MD5-Schutz verarbeitet, was große Verwirrung stiftet.

Nachteile: 32-Bit-Zeichen sind zu lang; es müssen nicht duplizierte Seed-Daten bereitgestellt werden; bei Sekunden als Seed-Daten kommt es dennoch zu Duplikaten.

Verwendung:

< ?php/*
*结合time()函数使用,以1970年到当前时间的秒数作为种子数。
*/$str=time();echo md5($str);?>
Nach dem Login kopieren

2.3 uniqid()

Gibt eine 13- oder 23-Bit-Zeichenfolge zurück.
Für unsere Zwecke ist uniqid() wie eine verbesserte Version von md5(), insbesondere da wir differenzielle Bezeichner als Zeichenfolgenpräfixe verwenden können, um die Wahrscheinlichkeit einer wiederholten Benennung zu verringern.

Für extreme Situationen wie nicht hohe Parallelität wird die Verwendung dieser Funktion empfohlen, die bereits allgemeine Anforderungen erfüllen kann.
Definition: Die Funktion uniqid() generiert eine eindeutige ID basierend auf der aktuellen Zeit in Mikrosekunden.
Verwendung: uniqid(prefix,more_entropy)
Erläuterung: Präfix kann der Ausgabezeichenfolge ein Präfix hinzufügen. Das Beispiel lautet wie folgt: Wenn der Parameter „more_entropy“ wahr ist, wird eine 23-Bit-Zeichenfolge ausgegeben.

< ?phpvar_dump(uniqid());var_dump(uniqid("a"));
?>
Nach dem Login kopieren

Das Ausgabeergebnis ist:

string(13) “51734aa562254″ string(14) “a51734aa562257″
Nach dem Login kopieren

Vorteile: 13-stellige Zeichenfolgenlänge ist eine akzeptable Dateinamenslänge; Präfixe können hinzugefügt werden, und das Ergebnis enthält Datenverwirrung, die kann Rückschläge vermeiden. Rohdaten übertragen.

Nachteile: Ähnlich wie bei MD5, hohe Parallelität, Verwendung von Sekunden als Startdaten, es kommt immer noch zu Duplikaten.

3. Aktualisierte Versionslösung

3.1 fast_uuid: Gibt eine 17-stellige Zahl zurück

Es ist ein bisschen wie eine unvollständige angepasste Version von uniqid(). Die „Seed-Nummer“ beginnt ", das in dieser Funktion erscheint. Der Begriff „Zeit“ ist sehr aufschlussreich.
Die in time() und uniqid() verwendete Standardzeit wird ab 1970 berechnet und die Länge beträgt zehn Ziffern (1366512439). Die Verwendung der „Startzeit der Startnummer“ kann diesen Wert reduzieren, da wir ihn tatsächlich benötigen ist nur ein Wert, der automatisch wachsen kann.
Nachdem die Startzeit individuell angepasst wurde, kann dies neben der Reduzierung der Länge auch zu Verwirrung führen.

/*
* 参数 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;
}
Nach dem Login kopieren

Ausgabe:

29832412631099013
Nach dem Login kopieren

3.2 time()+random number

Die Verwendung von Zufallszahlen ist bereits im obigen Beispiel zur Lösung aufgetaucht das Problem einer Sekunde Es sind mehrere Anfragen aufgetreten. Zwei Funktionen werden wie folgt bereitgestellt:

< ?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;
}?>
Nach dem Login kopieren

4. Die endgültige Lösung

Idee: Benutzer-ID+Sekunden+Zufallszahl. Darunter wird „Benutzer-ID+Sekunde“ von Dezimal in 64 umgewandelt, wodurch die Anzahl der Ziffern reduziert wird.

Benutzer-ID: Maximum Der in Dezimalzahl umgewandelte Wert in 64 „ZZZZ“ entspricht „16777215“ und der in Dezimalzahl umgewandelte Maximalwert von „ZZZ“ entspricht „262143“; Sekunden: Legen Sie Ihren eigenen Zeitstartpunkt fest .
  1. Zufallszahl: Verwenden Sie random(3), um eine dreistellige Zufallszahl zu generieren;

$less=time()-strtotime(’2012-4-21′); 转换为64进制”1SpRe“,5位$less=time()-strtotime(’2013-3-21′); 转换为64进制”_jHY“;4位
Nach dem Login kopieren
Endergebnis:
    4-stellige Benutzer-ID + 4-stellige Sekunde + 3-stellige Zufallszahl = 11-stellige Zeichenfolge. Obwohl die Ergebnisse denen von uniqid() ähneln, ist die Robustheit verbessert.
  1. 5. Zusammenfassung

  2. Dieser Artikel behandelt mehrere Methoden, die zum Umbenennen hochgeladener Bilder verwendet werden können. Der entscheidende Punkt ist die Verwendung von Dezimalzahlen in Hexadezimalzahlen, um die Zeichenfolge zu reduzieren.

Zum Beispiel wird die von fast_uuid generierte 17-stellige Zahl in eine Hexadezimalzahl mit nur 7 Zeichen umgewandelt.
Die spezifische Verwendung kann flexibel entsprechend Ihrer eigenen Situation verwendet werden .

Verwandte Empfehlungen:

So implementieren Sie PHP korrekt, um eindeutige Bezeichner zu generieren


Einige Regeln für PHP-Variablenbezeichner

So generieren Sie eindeutige Bezeichner in PHP

Das obige ist der detaillierte Inhalt vonSo generieren Sie eindeutige Bezeichner in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage