Wie erstelle ich eine eindeutige zufällige Integer-ID für den Primärschlüssel für die Tabelle?

7

Ich habe mich gefragt, ob jemand eine gute Möglichkeit zum Erstellen einer eindeutigen zufälligen Integer-ID für einen Primärschlüssel für eine Tabelle kannte. Ich benutze MySQL. Der Wert muss Integer sein.

    
MindGame 19.11.2010, 14:13
quelle

8 Antworten

5

Wenn Sie Vorschläge erhalten und diese implementieren können, verwenden Sie UUIDs. Die Funktion UUID() von MySQL gibt einen Wert von 36 Zeichen zurück, der für ID verwendet werden kann.

Wenn Sie integer verwenden möchten, müssen Sie trotzdem eine Funktion getRandID() erstellen, die Sie in der INSERT -Anweisung verwenden. Diese Funktion muss eine zufällige + Überprüfung der vorhandenen IDs verwenden, um eine, die zuvor nicht verwendet wurde, zurückzugeben.

Prüfe RAND() Funktion für MySQL.

    
byte_slave 19.11.2010, 14:19
quelle
12

Antwort auf: "Ich möchte diesen Wert verwenden, um zu Base62 zu kodieren und ihn dann für eine ID in einer URL zu verwenden. Wenn ich automatisch inkrementiere, könnte das offensichtlich sein der Benutzer, wie die URL-ID generiert wird. "

Wenn Sicherheit Ihr Ziel ist, dann hilft die Verwendung von Base62 selbst mit einer "zufällig" generierten Nummer nicht.

Eine bessere Option wäre:

  • Erfinde das Rad nicht neu - benutze AUTO_INCREMENT
  • Verwenden Sie dann eine kryptografische Hash-Funktion + eine zufällig generierte Zeichenfolge (in der db für diese bestimmte URL versteckt), um die endgültige "eindeutige ID für diese URL"
  • zu generieren
Gary Green 19.11.2010 14:55
quelle
7

Wie Sie die unique_ids erzeugen, ist eine nützliche Frage - aber Sie scheinen eine kontraproduktive Annahme über zu treffen, wenn Sie generieren!

Mein Punkt ist, dass Sie diese eindeutigen IDs zum Zeitpunkt der Erstellung Ihrer Zeilen nicht generieren müssen, da sie im Wesentlichen unabhängig von den eingefügten Daten sind.

Was ich tue, ist die Vorgenerierung eindeutiger IDs für die zukünftige Verwendung. So kann ich mir meine eigene süße Zeit nehmen und absolut garantieren, dass sie einzigartig sind, und es gibt keine Verarbeitung zum Zeitpunkt des Einfügens.

Zum Beispiel habe ich eine Bestellungstabelle mit order_id darin. Diese ID wird im laufenden Betrieb generiert, wenn der Benutzer die Bestellung inkrementell 1,2,3 usw. für immer eingibt. Der Benutzer muss diese interne ID nicht sehen.

Dann habe ich eine andere Tabelle - unique_ids mit (order_id, unique_id). Ich habe eine Routine, die jede Nacht läuft, die diese Tabelle mit genügend unique_id Zeilen vorlädt, um mehr als die Aufträge abzudecken, die in den nächsten 24 Stunden eingefügt werden könnten. (Wenn ich an einem Tag 10000 Bestellungen bekomme, habe ich ein Problem - aber das wäre ein gutes Problem!)

Dieser Ansatz garantiert die Eindeutigkeit und nimmt jede Verarbeitungslast weg von der Einfügetransaktion und in die Stapelroutine, wo sie den Benutzer nicht beeinflusst.

    
Rob Beer 05.08.2011 10:44
quelle
1

Wie wäre es mit diesem Ansatz ( PHP und MySQL ):

Kurz

  1. Zufälliges number für user_id (UNIQUE) generieren
  2. Zeile mit generiertem% ​​co_de% als number einfügen
  3. Wenn die Anzahl der eingefügten Zeilen gleich 0 ist, gehen Sie zu Punkt 1

Sieht schwer aus? Lesen Sie weiter.

Lang :

Tabelle:

%Vor%

Code:

%Vor%
  1. Alle Werte ( user_id , $min , $max ) dienen nur der Erläuterung und haben keine statistische Bedeutung.
  2. Die Funktionen 0.5 und insert_to_table sind nicht in PHP enthalten. Die sind auch als Zahlen nur zur Erläuterung der Erläuterung.
TheFrost 28.07.2013 20:22
quelle
0

mein Weg, sowohl für 32-Bit-und 64-Bit-Plattform. Ergebnis ist 64bit

%Vor%     
lbsweek 27.06.2014 14:49
quelle
0

Sie können AUTO_INCREMENT für Ihre Tabelle verwenden, aber den Benutzern die verschlüsselte Version geben:

verschlüsselte_id: SELECT HEX(AES_ENCRYPT(id, 'my-private-key'));

id: SELECT AES_DECRYPT(UNHEX(encrypted_id), 'my-private-key');

    
Const Mi 18.07.2017 09:17
quelle
0

AUTO_INCREMENT wird Ihre beste Wette dafür sein.

Hier sind einige Beispiele.

Wenn Sie möchten, können Sie einstellen, wo der Inkrementwert beginnt (standardmäßig ist es 1).

    
Webnet 19.11.2010 14:17
quelle
0

Es gibt ein AUTO_INCREMENT -Feature. Ich würde das benutzen.

Siehe hier weitere Beispiele.

    
drew 19.11.2010 14:17
quelle