|
|||
[PHP] IDs für mySQL generieren - Ansatz(?)
Ich würde gerne mit PHP, bevor ich einen neuen Datensatz anlege, eine ID für diesen mySQL-Eintrag generieren. In der bisherigen Entwicklungsphase wurde die Standardmethode von SQL genutzt (Numerische ID + auto_increment), was zB. bei Benutzerprofilen nicht gerade sinnvoll ist bzw. nicht sehr professionell wirkt.
Mein neuer Ansatz wäre folgendes: PHP-Code:
|
Sponsored Links |
|
||||
Würde ich auch sagen.
Das Problem bei der zufällig generierten ID ist, dass man jedes Mal überprüfen muss, ob die ID bereits existiert. U.U. wird 100 Mal hintereinander eine ID generiert, die es schon gibt, was dann 100 Queries zur Überprüfung nach sich zieht. Wenn es unbedingt irgendwas alpha-numerisches sein soll, dann würde ich dafür zusätzlich eine Spalte anlegen, wo eine zweite ID gespeichert wird. Diese ID könnte ein Hash, aus den anderen Feldern generiert, sein. Oder evtl. auf Universally Unique Identifier ? Wikipedia setzen, aber wahrscheinlich wäre das auch etwas übertrieben. Wieso soll es denn unprofessionell wirken, wenn Du eine einfache Zahl nimmst? Zur Anzahl der IDs: Du hast 26 Zeichen aus dem Alphabet und 10 Ziffern, macht 36 Zeichen. Weiterhin hast Du 8 Stellen, also lassen sich 36^8 = 2.821.109.907.456 verschiedene IDs generieren. Je mehr IDs Du aber bereits vergeben hast, desto wahrscheinlicher werden Kollisionen. Bei einer entsprechend gefüllten Tabelle würde der Overhead zur Überprüfung, ob die ID einmalig ist also vermutlich sehr stark ansteigen, wobei ich unterstelle, dass bei vielen Datensätzen eine hohe Wahrscheinlichkeit besteht eine ID zu generieren, die es bereits gibt. Eine Alternative wäre evtl. die Unix-Zeit mit Millisekunden zu verwenden und daraus was zu basteln, also bestimmte Stellen durch Buchstaben auszutauschen oder so, wenn es denn alpha-numerisch sein soll. Die Kollisionswahrscheinlichkeit wäre da geringer, denke ich, weil auch bei einer stark genutzten Datenbank wohl eher selten mehrere Leute zur gleichen Zeit (zur gleichen Millisekunde) einen Datensatz einfügen wollen. Überprüfen sollte man das aber natürlich dennoch. |
|
||||
Solange du den Wertebereich groß genug wählst, stellen Kollisionen kein wirkliches Problem dar. Statt deiner 42-Bit-Werte (ld(36^8) = 41,360) kannst du ja auch eine höheren Informationsgehalt verwenden, beispielsweise 48, 56, 64 … Bit. (Ein durch 8 teilbarer Wert bietet sich dadurch an, dass er direkt als Bytefolge ohne Redundanz gespeichert werden kann.)
Wenn du beispielsweise statt der 36 Varianten pro Zeichen alle 256 möglichen Varianten verwendest, hättest du schon insgesamt 1,8e+19 statt der vorherigen 2,8e+12 Möglichkeiten. Als Quelle der Werte müsstest du zwischen zwei Eigenschaften entscheiden: Eindeutigkeit und Zufälligkeit. Eine eindeutige Wertequelle wäre der UUID-Algorithmus oder uniqid(), eine zufällige die bekannten Zufallsfunktionen wie etwa rand().
__________________
Markus Wulftange |
Sponsored Links |
Themen-Optionen | |
Ansicht | |
|
|
Ähnliche Themen | ||||
Thema | Autor | Forum | Antworten | Letzter Beitrag |
[PHP] Daten aus MySQL in Array geben und ausgeben | bullseye | Serveradministration und serverseitige Scripte | 5 | 23.07.2008 14:48 |
[PHP] mysql datenbank updaten; fehler | lippoli15 | Serveradministration und serverseitige Scripte | 8 | 21.02.2006 22:25 |