Eindeutige 5stellige ID erzeugen

ok super, vielen Dank für eure Antworten! Da ich die IDs wahrscheinlich zyklisch alle 4 Wochen oder so löschen werde, komme ich mit der ein oder anderen Lösung sehr gut hin!
 
Wie wäre es, wenn du einfach alle möglichen 5 stelligen Alphanumerischen ID's generierst und speicherst.
Die Liste randomisierst (shuffle) du, und nimmst dann immer wenn du eine brauchst aus der Liste (pop).
Wenn die ID wieder freigegeben wird, hängst du sie einfach wieder dran (push),
Die Liste kannst du bei jedem push noch mal randomisieren (oder jedes 10. 100. Mal)
 
36^5 = 60.466.176 -> 60 Mio Einträge. Und da sind wir bei einer Grundsatzfrage. Wenn wir pro Sekunde 10 Generierungen machen, haben wir für 6 Mio. Sekunden (~70 Tage) eindeutige IDs. Diese pop/push-List ist ja nett gemeint und so falsch nicht, aber doch ganz schön auf den Putz gehauen :) Läuft ne DB? Bei Nutzung einer ID Eintrag machen mit timestamp. Einmal am Tag per cron checken, und alle Einträge älter als x Tage löschen. Bei jeder Neugenerierung Abfrage, ob ID schon existiert, wenn Ja, neuer Versuch (wo ich aber von ausgehe, dass es dazu wohl verdammt selten kommen wird)

mfg chmee
 
Du solltest dich einfach für eine der Methoden entscheiden. Entweder Unix-Timestamp, uniqid() oder was dir sonst noch so einfällt. Aber egal wieviele ID's innerhalb des Monats erstellt werden müssen und wie wahrscheinlich es ist, dass durch eine dieser Methoden zwei mal die selbe ID generiert wird, du solltest auf gar keinen Fall darauf verzichten zu prüfen, ob die ID bereits vorhanden ist. Man darf sich nicht darauf verlassen, dass schon nichts passieren wird. Wenn man mögliche Fehlerquellen erkennt, sollte man diese auch sofort ausschalten.
Das Überprüfen, ob die ID bereits in der Datenbank vorhanden ist geht ja schnell und es ist nur eine SQL-Abfrage. Wenn die ID bereits vorhanden ist, erstelle eine neue aber überprüfe diese erneut!
 
Hallo,
wenn dieser Thread aufleben soll, dann möchte ich auch meinen Senf dazu geben:

Erst mal ist klar, dass man eine Zufallszahl mit der rand()-Funktion erzeugen kann. Der Rückgabewert ist aber vom Typ INTEGER und kein ID-Name. Mit der base_convert()-Funktion kann man aber einen zufälligen INTEGER-Wert in einen String konvertieren und wenn man eine Zahlenbasis größer 10 wählt, dann kriegt man außer den Zahlen von 0 bis 9 auch Buchstaben dazu. Bei der Zahlenbasis 16 (Hexadezimalwerte) sind das die Zeichen "a..f" und bei der Zahlenbasis 36 kriegt man "a..z".

Etwa so:
PHP:
$idRand = base_convert(rand($intMin, $intMax), 10, 36);

Will man einen Zufallsnamen $idRand mit einer maximalen Länge von $length Zeichen (z.B. 5) erhalten, dann kann man den Wert von $intMax durch Konvertierung des Maximalstrings "zzzzz" in das Dezimalsystem berechnen:

PHP:
$idLength = 5;
$strMax = str_repeat('z', $idLength);
$intMax = intval(base_convert($strMax, 36, 10));

In Abhängigkeit von Namenskonventionen für IDs ist u.U. auch die Festlegung eines bestimmten Minimalwertes für die Zufallszahlenerzeugung notwendig.
Wenn als $intMin einfach Null eingesetzt wird, dann erhält man auch Ergebnisnamen, die kürzer als 5 Zeichen sind. Das kann man verhindern, indem $strMin einfach eine Stelle weniger als $strMax bekommt und anschließend inkrementiert wird:

PHP:
$strMin = substr($strMax, 1);
$intMin = 1 + base_convert($strMin, 36,10);

Weiterhin sollten IDs als erstes Zeichen einen Buchstaben haben. Das kann ebenfalls über den Minimalwert realisiert werden indem ein $strMin-Wert erzeugt wird, der als erstes Zeichen ein "a" hat:

PHP:
$strMin = '9'.substr($strMax, 1);
$intMin = 1 + base_convert($strMin, 36,10);

Schon fertig. :)
Ist eigentlich nicht kompliziert, oder?

Auch noch wichtig: Bei einem 32-Bit-System sollte man nur IDs erzeugen mit einer maximalen Zeichenlänge von 6.
 
Zuletzt bearbeitet:
Stand denn irgendwo, dass es kein String sein darf? Ich halte die Einschränkung des ersten Zeichen für unwichtig und unnötig - eher sogar kontraproduktiv, wenn diese id zB nicht erratbar sein soll. Angenommen, es werden nur 100 pro Tag ausgestellt und alle 7 Tage refreshed, dann kann diese id sehr wohl eine Sicherheitsmaßnahme sein, die unter der von Dir genannten Einschränkung leidet.

mfg chmee
 
Stand denn irgendwo, dass es kein String sein darf? Ich halte die Einschränkung des ersten Zeichen für unwichtig und unnötig - eher sogar kontraproduktiv, wenn diese id zB nicht erratbar sein soll...
Das verstehe ich nicht, wieso "kontraproduktiv"? Wenn du in einem HTML-Formular eine ID brauchst, dann unterliegt die Namensgebung diesen Konventionen.
Außerdem ist die Einschränkung, dass das erste Zeichen keine Zahl sein soll, eine Option.
 
Angenommen, Du hast ein Datenspeicher, anonym und zB 3 Tage haltbar, dann wäre die ID die einzige Möglichkeit, da ran zu kommen. Wenn diese ID "möglicherweise" aus Gründen der Datensicherheit quasi nicht erratbar sein soll, korrumpierst Du die statistische Vielfalt. Wenn diese ID als ID in einem HTML-Knoten benötigt würde, täte ich ein Zeichen (aus Gründen der Funktionsfähigkeit) vorsetzen anstatt die Stochastik zu beschränken.

mfg chmee
 
Angenommen, Du hast ein Datenspeicher, anonym und zB 3 Tage haltbar, dann wäre die ID die einzige Möglichkeit, da ran zu kommen...
Genau, dann muss man sich die ID irgendwie merken.

Wenn diese ID "möglicherweise" aus Gründen der Datensicherheit quasi nicht erratbar sein soll, korrumpierst Du die statistische Vielfalt. Wenn diese ID als ID in einem HTML-Knoten benötigt würde, täte ich ein Zeichen (aus Gründen der Funktionsfähigkeit) vorsetzen anstatt die Stochastik zu beschränken.
Also ich erzeuge einen Namen, der 6 Zeichen lang sein soll und die einzelnen Zeichen des Namens bestehen aus den Zeichen "0..9" und "a..z". Ich beschränke dann meine "statische Vielfalt", indem ich beim ersten Zeichen nur die Zeichen "a..f" zulasse und habe damit etwa 28% der (ingesamt 2.087.017.473) möglichen Namen gestrichen. Nun meine Frage: Wieviel Namen sind gestrichen, wenn man nur Namen mit der Länge 5 erzeugt und dort ein festes Zeichen davor setzt?
 
36^5 = 60 Mio (alle 5 aus 36) + ein fix bringt eine stelle mehr, statistisch aber keine variation
5* 36^4 = 8,3 Mio (erstes aus 5 und 4 aus 36)
36^4 = 1,6Mio (4 aus 36) + eine fix eine stelle mehr (wie oben)

(weil ich mit 0-9a-z rechne = 36) Man könnte nun noch berechnen, um wieviel sich die Suchzeit verkürzt, wenn man zB 10 Suchdurchgänge/sek ansetzt. Verstehe ich Dich also so, dass Du lediglich einen fixen Buchstaben davor setzen willst, damit es HTML-konform ist..?

mfg chmee
 
Zurück