Wie erstellen Sie einzigartige random-integer-ID für den Primärschlüssel für die Tabelle?
Ich Frage mich, ob jemand wusste, dass ein guter Weg, um erstellen Sie eine einzigartige random-integer-id für den Primärschlüssel für eine Tabelle. Ich bin mit MySQL. Der Wert muss integer sein.
- warum nicht einfach
AUTO_INCREMENT
? - Weil ich will, dass der Wert Base62 Kodieren und verwenden Sie dann, dass für eine id in einer url. Wenn ich auto increment, könnte es für den Nutzer offensichtlich, wie die url-id generiert.
- Um rund um Ihre Sicherheitsfragen, die Sie nutzen könnten AUTO_INCREMENT und beinhalten eine zufällig erstellte Nummer, die als ein Feld. Um Ihre Benutzer-id, die Sie nehmen das AUTO-id +, die Zufallszahl. Führen Sie es durch einen hash (SHA128 wird gut funktionieren). Auch wenn die zufällige Zahl ist die gleiche (das es realistisch gesehen nicht), die Kombination mit einer anderen Nummer, dann SHA ' Ing es wird geben Sie Ihre Benutzer-id.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Ihr sind offen für Vorschläge und realisieren Sie es, verwenden Sie UUIDs.
MySQL ist
UUID()
Funktion zurückgeben 36 chars Wert, der verwendet werden kann fürID
.Wenn Sie möchten, verwenden Sie integer, dennoch denke ich, müssen Sie eine Funktion erstellen
getRandID()
dass Sie in derINSERT
- Anweisung. Diese Funktion muss auf random + prüfen der bestehenden ids zurück, die nicht verwendet werden, bevor.Überprüfen
RAND()
Funktion für MySQL.In Antwort auf: "Weil ich will, dass der Wert Base62 Kodieren und verwenden Sie dann, dass für eine id in einer url. Wenn ich auto increment, könnte es für den Nutzer offensichtlich, wie die url-id generiert wird."
Wenn die Sicherheit ist euer Ziel, dann mit Base62, sogar mit einem "zufällig" generierte Nummer wird nicht helfen.
Eine bessere option wäre:
AUTO_INCREMENT
Wie generieren Sie die unique_ids ist eine sinnvolle Frage - aber Sie zu sein scheinen, kontraproduktiv Annahme über wenn Sie erzeugen Sie!
Mein Punkt ist, dass Sie nicht brauchen, zu generieren, diese einzigartigen id ' s zu der Zeit der Erstellung Ihrer Reihen, weil Sie im wesentlichen unabhängig von den Daten eingefügt werden.
Was ich tun müssen, ist vorab eine eindeutige id für die zukünftige Verwendung, so kann ich nehme meine eigene süße Zeit und absolut garantieren, Sie sind einzigartig, und es gibt keine Bearbeitung erfolgen an der Zeit einfügen.
Zum Beispiel ich habe eine Tabelle Bestellungen mit order_id in es. Diese id wird dynamisch generiert, wenn der Benutzer die Reihenfolge, schrittweise 1,2,3 usw. immer. Der Benutzer braucht nicht zu sehen, diese interne id.
Dann habe ich noch eine Tabelle - unique_ids mit (order_id, unique_id). Ich habe eine routine, die ausgeführt wird, die jede Nacht vor und lädt diese Tabelle mit genug unique_id Zeilen, um mehr als decken die Aufträge, die möglicherweise eingefügt werden in den nächsten 24 Stunden. (Wenn ich jemals in 10000 Bestellungen an einem Tag werde ich ein problem haben - aber das wäre ein gutes problem zu haben!)
Dieser Ansatz garantiert Einzigartigkeit und nimmt eine etwaige Verarbeitung der Belastung Weg von den insert-Transaktion und in die batch-routine, wo es keinen Einfluss auf die Benutzer.
Wie über diesen Ansatz (
PHP
undMySQL
):Kurze
number
füruser_id (UNIQUE)
number
alsuser_id
Sieht schwer aus? Weiter Lesen.
Lange:
Tabelle:
Code:
$min
,$max
,0.5
) sind nur für die Erklärung, und Sie haben keine statistische Bedeutung.insert_to_table
undreport_this_fact
sind nicht zu bauen, in PHP. Die sind auch als zahlen nur für die Klärung der Erklärung dient.mein Weg, für beide 32bit und 64bit-Plattform. Ergebnis ist 64bit
Können Sie eine
AUTO_INCREMENT
für die Tabelle, sondern geben den Nutzern die verschlüsselte version:encrypted_id:
SELECT HEX(AES_ENCRYPT(id, 'my-private-key'));
id:
SELECT AES_DECRYPT(UNHEX(encrypted_id), 'my-private-key');
AUTO_INCREMENT
wird Ihre beste Wette für diese.Hier sind einige Beispiele.
Wenn Sie brauchen, um können Sie anpassen, in denen die Inkrement-Wert beginnt (standardmäßig ist es 1).
Es ist ein
AUTO_INCREMENT
Funktion. Ich würde die verwenden.Sehen hier mehr Beispiele.