Je veux créer une chaîne aléatoire d'une longueur fixe (8 caractères dans mon cas d'utilisation) et la chaîne générée doit être sensible à la casse et unique par rapport à une liste noire. Je sais que cela ressemble à un UUID mais j'ai une exigence spécifique qui me empêche de les utiliserChaîne unique aléatoire contre une liste noire
- certains caractères ne sont pas autorisés, à savoir I, l et 1 sont lookalikes et O et 0 ainsi
Ma mise en œuvre initiale est solide et résout la tâche mais fonctionne mal. Et par mal, je veux dire, il est condamné à être de plus en plus lent chaque jour.
Voici mon implémentation actuelle je veux optimiser:
private function uuid()
{
$chars = 'ABCDEFGHJKLMNPQRSTVUWXYZabcdefghijkmnopqrstvuwxyz23456789';
$uuid = null;
while (true) {
$uuid = substr(str_shuffle($chars), 0, 8);
if (null === DB::table('codes')->select('id')->whereRaw('BINARY uuid = ?', [$uuid])->first())) {
break;
}
}
return $uuid;
}
S'il vous plaît épargnez-moi la critique, nous vivons dans un monde agile et cette mise en œuvre est fonctionnelle et est rapide au code.
Avec un petit ensemble de données, il fonctionne magnifiquement. Cependant, si j'ai 10 millions d'entrées dans la liste noire et que j'en essaie de créer 1000 autres, cela échoue car cela prend plus de 30 minutes. Un cas d'utilisation réel serait d'avoir plus de 10 millions d'entrées dans la base de données et de tenter de créer 20 000 nouveaux codes uniques.
Je pensais avant l'ensemencement toutes les valeurs admises, mais ce serait fou: (24 + 24 + 8)^8 = 9.6717312e + 13
Ce serait bien si la communauté peut me diriger dans la bonne direction.
Best, Nikola
Faut-il être imprévisible/non-accessible? Quelles sont les raisons pour lesquelles vous ne pouvez pas simplement utiliser un compteur incrémenté? –
Malheureusement oui, il doit être imprévisible. Pensez aux codes de réduction. – enikola