Frage

Ich suche nach einer Möglichkeit, speziell in PHP, dass ich garantiert immer einen eindeutigen Schlüssel bekomme.

Ich habe Folgendes getan:

strtolower(substr(crypt(time()), 0, 7));

Aber ich habe festgestellt, dass ich hin und wieder einen Nachschlüssel habe (selten, aber oft genug).

Ich habe auch darüber nachgedacht:

strtolower(substr(crypt(uniqid(rand(), true)), 0, 7));

Aber laut der PHP-Website könnte uniqid(), wenn uniqid() zweimal in derselben Mikrosekunde aufgerufen wird, denselben Schlüssel generieren.Ich denke, dass das Hinzufügen von rand() zwar selten vorkommt, aber dennoch möglich ist.

Nach den oben erwähnten Zeilen entferne ich auch Zeichen wie L und O, damit es für den Benutzer weniger verwirrend ist.Dies ist möglicherweise ein Grund für die Duplikate, aber dennoch notwendig.

Eine Option, die mir in den Sinn kommt, wäre die Erstellung einer Website, die den Schlüssel generiert, ihn in einer Datenbank speichert und so sicherstellt, dass er völlig einzigartig ist.

Irgendwelche anderen Gedanken?Gibt es Websites, die dies bereits tun und über eine Art API verfügen oder nur den Schlüssel zurückgeben?ich fand http://userident.com aber ich bin mir nicht sicher, ob die Schlüssel völlig einzigartig sein werden.

Dies muss im Hintergrund ohne Benutzereingaben ausgeführt werden.

War es hilfreich?

Lösung

Es gibt nur 3 Möglichkeiten, eindeutige Werte zu generieren, eher sie Passwörter, Benutzer-IDs, etc.

  1. Verwenden Sie einen wirksamen Generator GUID - das ist lang und nicht geschrumpft werden kann. Wenn Sie nur einen Teil FAIL Sie .
  2. Zumindest ein Teil der Anzahl sequentiell aus einer einzelnen Sequenz erzeugt. Sie können Flusen oder Codierung hinzufügen, um es weniger sequenziellen aussehen. Vorteil ist, dass sie beginnen kurz - Nachteil ist, benötigen sie eine Hand. Die Arbeit um für die Hand Begrenzung ist zu Quellen nummeriert, so dass Sie umfassen die [Quelle #] + [Seq #] und dann kann jede Quelle seiner eigenen Sequenz erzeugen.
  3. Generieren sie über andere Mittel und prüfen sie dann gegen die einzelne Geschichte der zuvor erzeugten Werte.

Eine andere Methode ist nicht garantiert. Denken Sie daran, im Grunde erzeugen Sie eine binäre Zahl (es ist ein Computer), aber dann können Sie kodieren sie in Hexadezimal, Dezimal, Base64, oder einer Wortliste. Wählen Sie eine Codierung, die Ihre Nutzung passt. In der Regel für den Benutzer eingegebenen Daten möchten Sie einige Variationen von Base32 (die man angedeutet).

Hinweis über GUIDS : Sie ihre Stärke der Einzigartigkeit von ihrer Länge gewinnen, und das Verfahren verwendet, um sie zu erzeugen. Alles, was weniger als 128 Bits nicht sicher ist. Jenseits Erzeugung von Zufallszahlen gibt es Merkmale, die in eine GUID gehen, um es einzigartig. Denken Sie daran, sie sind nur praktisch einzigartig, nicht ganz eindeutig. Es ist möglich, obwohl praktisch unmöglich, ein Duplikat zu haben.

aktualisiert Notiz über GUIDS : Da dieses Schreiben habe ich gelernt, dass viele GUID-Generatoren verwenden eine kryptografisch sicheren Zufallszahlengenerator (schwierig oder unmöglich die nächste Nummer erzeugt vorherzusagen, und wahrscheinlich nicht wiederholen). Es gibt tatsächlich 5 verschiedene UUID Algorithmen . Algorithmus 4 ist das, was zur Zeit Microsoft für den Windows-GUID Generation API verwendet. Eine GUID ist Microsofts Implementierung des UUID-Standard.

Aktualisieren : Wenn Sie 7-16 Zeichen wollen, dann müssen Sie entweder Methode 2 oder 3

verwenden.

Fazit : Ehrlich gesagt gibt es nicht so etwas wie einzigartig. Selbst wenn Sie mit einem sequentiellen Generator ging würden Sie schließlich aus dem Lager laufen alle Atome im Universum verwenden, also zurück auf sich selbst Looping und zu wiederholen. Ihre einzige Hoffnung wäre, die wärmetod vor Punkt erreicht hat.

Auch der beste Zufallszahlengenerator hat die Möglichkeit, auf die Gesamtgröße der Zufallszahl gleich die Wiederholung Sie generieren. Nehmen Sie ein Viertel zum Beispiel. Es ist ein völlig Zufallsbitgenerators, und seine Chancen des Wiederholens sind 1 in 2

So ist es läuft alles auf Ihre Schwelle von Einzigartigkeit kommt. Sie können durch die Verwendung einer Sequenz, die für 1.099.511.627.776 Zahlen 100% Einmaligkeit in 8 Ziffern haben und Base32 dann codiert. Jede andere Methode, die beinhaltet keine Überprüfung gegen eine Liste der letzten Zahlen hat nur Chancen gleich n / 1.099.511.627.776 (wobei n = Anzahl der vorherigen Zahlen generiert) von nicht eindeutig zu sein.

Andere Tipps

Jeder Algorithmus wird in Duplikaten führen .

Daher könnte ich vorschlagen, dass Sie Ihren vorhandenen Algorithmus verwenden * und einfach nach Duplikaten überprüfen?

* Leichte Zusatz: Wenn uniqid() kann basierend auf der Zeit nicht eindeutig sein, auch einen globalen Zähler, die Sie nach jedem Aufruf erhöhen. So etwas ist anders, auch in der gleichen Mikrosekunde.

Ohne den Code zu schreiben, meine Logik wäre:

Erstellen Sie eine zufällige Zeichenfolge aus, was auch immer akzeptablen Zeichen Sie mögen.
Dann fügen Sie die Hälfte des Datumsstempel (Teil Sekunden und all) nach vorne und der anderen Hälfte bis zum Ende (oder irgendwo in der Mitte, wenn Sie bevorzugen).

Bleiben Sie JOLLY!
H

Wenn Sie Ihre ursprüngliche Methode, verwenden aber den Benutzernamen oder E-Mailadresse vor dem Passwort hinzufügen, wird es immer eindeutig sein, wenn jeder Benutzer nur ein Passwort haben.

Sie können in diesem Artikel interessiert sein, die mit dem gleichen Problem befasst: GUIDs sind weltweit einzigartig, aber Substrings von GUIDs werden nicht.

  
    

Das Ziel dieses Algorithmus ist die Kombination von Zeit und Ort ( „Raum-Zeit-Koordinaten“ für die Relativität Freaks da draußen) als der Einzigartigkeit Schlüssel zu verwenden. Allerdings Zeitnehmung ist nicht perfekt, so gibt es eine Möglichkeit, dass zum Beispiel zwei GUIDs in schnellen Folge von der gleichen Maschine erzeugt werden, so nahe beieinander in der Zeit, dass der Zeitstempel gleich sein würde. Das ist, wo die uniquifier Spiel kommt.

  

Ich mache es in der Regel wie folgt aus:

$this->password = '';

for($i=0; $i<10; $i++)
{
    if($i%2 == 0)
        $this->password .= chr(rand(65,90));
    if($i%3 == 0)
        $this->password .= chr(rand(97,122));
    if($i%4 == 0)
        $this->password .= chr(rand(48,57));
}

Ich nehme an, es gibt einige theoretischen Löcher, aber ich hatte noch nie ein Problem mit Duplikation. Ich kann es in der Regel für temporäre Passwörter verwenden (wie nach einem Passwort-Reset) und es funktioniert gut genug.

Wie Frank Kreuger kommentiert, geht mit einem GUID-Generator.

Wie dieses

Ich sehe noch nicht, warum die Passwörter eindeutig sein? Was ist der Nachteil, wenn 2 Ihrer Benutzer das gleiche Passwort?

Das setzt voraus, wir reden über Passwörter, die Benutzer-IDs gebunden sind, und nicht nur eindeutige Kennungen. Wenn das ist , was Sie suchen, warum nicht GUIDs verwenden?

Sie können in Steve Gibson over-the-top-sichere Implementierung eines Passwort-Generator interessiert sein (keine Quelle, aber er hat eine detaillierte Beschreibung, wie es funktioniert) unter https://www.grc.com/passwords.htm .

Die Website schafft riesige 64-Zeichen-Passwörter aber, da sie völlig zufällig sind, können Sie leicht die ersten 8 (oder wie viele) Zeichen für ein weniger sicher, aber „so zufällig wie möglich“ Passwort nehmen könnten.

EDIT: von Ihrer späteren Antwort sehe ich Dir etwas mehr wie eine GUID als ein Passwort benötigen, so ist dies wahrscheinlich nicht das, was Sie wollen ...

Ich glaube nicht, dass ein Teil Ihrer Frage ist, dass Sie uns eine einzigartige Funktion für zwei getrennte Anwendungen versuchen ... Passwörter und TRANSACTION_ID

diese wirklich sind zwei verschiedene Problembereiche und es ist wirklich nicht am besten, um zu versuchen, sie gemeinsam zu behandeln.

Ich wollte vor kurzem eines schnellen und einfachen Zufall eindeutigen Schlüssel, damit ich das tat folgende:

$ukey = dechex(time()) . crypt( time() . md5(microtime() + mt_rand(0, 100000)) ); 

Also, im Grunde, erhalte ich die Unix-Zeit in Sekunden und eine zufällige Zeichenfolge md5 von Zeit + Zufallszahl generiert hinzuzufügen. Es ist nicht die beste, aber für Niederfrequenzanforderungen ist es ziemlich gut. Es ist schnell und funktioniert.

habe ich einen Test, wo ich Tausende von Schlüsseln erzeugen würde und dann für Wiederholungen und je etwa 800 Tasten mit zweiten keine Wiederholungen waren, also nicht schlecht. Ich denke, es hängt ganz von mt_rand ()

Ich benutze es für eine Umfrage Tracker, wo wir eine Übermittlungsrate von etwa 1000 Umfragen pro Minute bekommen ... so jetzt (Kreuz Finger) gibt es keine Duplikate. Natürlich ist die Rate nicht konstant ist (wir die Anträge zu bestimmten Zeiten des Tages zu bekommen), so dieser Beweis nicht nicht noch die beste Lösung ... die Spitze eines inkrementellen Wert als Teil des Schlüssels verwendet (in meinem Fall, Früher habe ich Zeit (), aber könnte besser sein).

Ingoring den Crypten Teils, der nicht viel zu tun hat, mit einem eindeutigen Wert zu schaffen ich dies in der Regel ein verwenden:

function GetUniqueValue()
{
   static $counter = 0; //initalized only 1st time function is called
   return strtr(microtime(), array('.' => '', ' ' => '')) . $counter++;
}

Wenn in demselben Prozess $ Zählern genannt wird erhöht, so Wert immer einzigartig in demselben Prozess ist.

Wenn in verschiedenen Prozessen aufgerufen werden, müssen Sie wirklich Pech 2 micro zu bekommen () mit den gleichen Werten nennen, denken, dass micro () ruft hat in der Regel unterschiedliche Werte, wenn auch in demselben Skript aufgerufen.

ich in der Regel eine zufällige Teilkette (Randomisierung, wie viele Zeichen zwischen 8 eine 32 oder weniger für Benutzerfreundlichkeit) oder den MD5 von einigem Wert ich in bekommen haben, oder die Zeit oder eine Kombination. Weitere Zufälligkeit kann ich MD5 kommen Wert (sagen Nachnamen) verketten, dass mit der Zeit, MD5 es wieder, dann den Zufallsstring nehmen. Ja, Sie könnte gleich Passwörter bekommen, aber es ist nicht sehr wahrscheinlich überhaupt nicht.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top