2009-06-01 16 views
2

Ich habe zwei Funktionen, makeKey() und keyExists().Erstellen eines eindeutigen Schlüssels - effizienteste Möglichkeit

makeKey() generiert einfach einen fünfstelligen alphanumerischen Zufallsschlüssel, keyExists() akzeptiert diesen Schlüssel als einziges Argument und sucht in einer Tabelle nach und gibt wahr/falsch zurück, je nachdem, ob er existiert.

Ich muss etwas sehr einfaches tun, aber ich kann den schnellsten Weg nicht herausfinden.

Ich muss nur einen Schlüssel erstellen, und wenn es in der Tabelle existiert, einen Schlüssel erneut machen, und so weiter, bis eine eindeutige zurückgegeben wird. Ich denke, eine While-Schleife reicht aus?

Danke und bitte verzeihen Sie die eher grundlegende Frage, ich denke, ich habe gestern mein Gehirn in der Sonne gekocht.

+0

Es dauert eine Weile, nachdem Sie 99999 Zeilen haben. –

Antwort

5

ich do verwenden würde - while Schleife:

do { 
    $newKey = makeKey(); 
} while (keyExists($newKey)); 

Dies wird einen neuen Schlüssel auf jeden generieren Iteration, bis der Schlüssel noch nicht existiert.

2

mein PHP ist ein wenig rostig, so betrachten diese Pseudo-Code:

$key_exists = true; 
while($key_exists) { 
     $key = generateKey(); 
     $key_exists = checkKey($myKeysHash, $key); 
} 
// $key is now unique and ready to use 
0

Sie erwähnen eine Tabelle, also frage ich mich, ob Sie diese Schlüssel in einer Datenbank speichern? Wenn dies der Fall ist, wird Ihr Ansatz eine Wettlaufsituation haben - Sie könnten prüfen, ob ein Schlüssel OK ist, um ihn zu verwenden, bevor ein anderer Prozess diesen Schlüssel verwendet.

Ein besserer Ansatz besteht darin, einen möglichen Schlüssel zu generieren und dann zu versuchen, ihn zu erhalten - vielleicht indem Sie eine INSERT-Anweisung für eine Schlüsseltabelle ausführen und mit verschiedenen Schlüsseln versuchen, bis sie erfolgreich ist.

5

Jede Lösung, die auf das Erstellen und anschließende Überprüfen angewiesen ist, wird eine schreckliche Leistung haben, wenn sich der Schlüsselraum füllt. Sie sollten besser einen eindeutigen Schlüssel mithilfe einer automatisch generierten Spalte (Identität oder GUID) generieren. Wenn es alphanumerisch sein muss, verwenden Sie eine Zuordnungsfunktion, um es in das Alphabet Ihrer Wahl umzuwandeln, indem Sie Gruppen von Bits auswählen und diese als Index für Ihr Alphabet verwenden.

Pseudo-Code

alphabet = "ABCDE...789"; 
key = insert new row, get autogenerated key 
alphaKey = ""; 
while (get n bits from key) 
    alphaKey += alphabet[bits] 
done 
echo alphaKey 
0

Wenn Sie auf einem 5-stellige Nummer nicht festgelegt sind, werden Sie über die Verwendung einer Hash Ihrer ID + eine Namensspalte denken konnte.

1

Warum nicht eine eingebaute php Funktion wie uniqid()?

0

Ich nehme auch an, dass Sie eine Art Datenbank verwenden.

Können Sie keine eindeutige Auto-Increment ID-Spalte in der Datenbank verwenden? Es würde die Anforderung zur Überprüfung, ob der Schlüssel existiert, entfernen, da die Datenbank-Engine niemals dieselbe ID zweimal zuweisen wird.

Sie müssen jedoch die Logik in Ihrer Anwendung ändern, anstatt nur neue Funktionen zu programmieren.

0

Muss es zufällig sein? Erhöhen Sie einfach eine Variable und speichern Sie die nächste, die in einem anderen Feld verwendet werden soll.

0

while (keyExists($newKey = makeKey()));

Wahrscheinlich der schnellste Weg, um die Kontrolle zu tun, wenn ein Schlüssel vorhanden einen neuen generieren. Wenn Sie viele Kollisionen haben oder viele Male die Datenbank überprüfen müssen, bevor Sie einen neuen eindeutigen Schlüssel erhalten, werden Sie wahrscheinlich Ihren makeKey() Algorithmus überdenken wollen. Anrufe in die Datenbank sind teuer, je weniger Anrufe Sie tätigen können, desto schneller und effizienter wird Ihr Skript.

Verwandte Themen