Jeśli potrzebujesz około 10 milionów unikalnych kluczy (na przykład), najlepszym rozwiązaniem jest wybranie wykładniczo większej przestrzeni kluczy i rozpoczęcie losowego generowania. Przeczytaj o paradoksie urodzinowym -- to główna rzecz, o którą powinieneś się martwić. Jeśli chcesz mieć 2^n unikalnych i bezpiecznych kluczy, upewnij się, że istnieje co najmniej 2^(2 * n) możliwych wartości. Oto przybliżony algorytm O(n log n):
- Użyj przestrzeni klucza wynoszącej co najmniej 2^50 (innymi słowy, zezwól na 2^50 możliwych unikalnych wartości), a w całym zbiorze danych nie wystąpią prawie żadne kolizje — a każdy brutalny wymuszający mają równe szanse na zdobycie klucza, jeśli spróbują 2^25 z nich.
- wygeneruj tyle liczb losowych, ile potrzebujesz
- indeksuj bazę danych na swoim kluczu (jest to krok O(n lg n):sortowanie)
- przeglądać bazę danych i iterować po całym zestawie danych, aby przyciąć duplikaty (pseudokod poniżej)
- Usuń zduplikowane wiersze i gotowe.
Pseudokod:
$last = null;
while ($current = getnext()) {
if ($last == $current) {
push($toDelete, $current);
}
$last = $current;
}