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

So generieren Sie eindeutige Bezeichner in PHP

小云云
小云云Original
2018-03-22 14:29:402369Durchsuche


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;
 }
}?>

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);?>

Ausgabe:

8b1a9953c4611296a827abf8c47804d7

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);?>

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"));
?>

Das Ausgabeergebnis ist:

string(13) “51734aa562254″ string(14) “a51734aa562257″

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;
}

Ausgabe:

29832412631099013

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;
}?>

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位
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!

Stellungnahme:
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