Cea mai eficientă modalitate ar fi să folosiți a Algoritmul de criptare pentru păstrarea formatului; acesta este un algoritm care este o permutare peste un set de dimensiuni arbitrare (de exemplu, o secvență de 10 cifre zecimale).
Utilizarea acesteia ar fi simplă: ați alege o cheie aleatorie și ați stoca-o; ai păstra, de asemenea, un număr de secvență (în același format ca rezultatul, de exemplu, ai putea începe cu 0000000000). Apoi, când vine timpul să generați următorul ID, ați incrementa numărul de secvență și ați trimite-l prin algoritmul FPE; acesta este următorul tău ID [1].
Deoarece algoritmul FPE este o permutare, nu veți genera niciodată același ID de două ori până la încheierea numărului de secvență; prin urmare, fără ciocniri. Puteți face ID-ul cât de scurt este necesar (algoritmii actuali FPE au probleme cu spațiile cu adevărat mici; dacă păstrați ID-ul să fie, să zicem, cel puțin 6 cifre, ați fi în siguranță). Și, deoarece algoritmii FPE sunt siguri, orice ID nu oferă nicio informație despre niciun alt ID (inclusiv ordinea relativă de generare).
Dezavantajul: nu există (din câte știu eu) biblioteci FPE comune disponibile. Pentru utilizare, aș sugera FF1 din acest document; implementarea acesteia de la zero ar fi puțin de lucru (dar v-ar satisface nevoile).
O metodă mai puțin eficientă, dar mai ușor de implementat ar fi să faceți o variație a ceea ce ați sugerat: păstrați o listă cu ID-urile pe care nu le-ați atribuit încă.
Aici, în timpul configurării, veți inițializa o listă cu toate ID-urile posibile în ordine secvențială, să spunem de la 000000 la 999999. În plus, veți seta o valoare N la cel mai mare ID nealocat (în acest exemplu, N = 999999).
Apoi, când vine timpul să emiti un nou ID, ai alege un număr aleatoriu x între 0 și N (inclusiv). Apoi, ați schimba ID-urile la indicii N și x (și dacă x=N, atunci această operație de schimb nu face nimic); apoi, veți scoate valoarea care nu este în indicele N (și apoi decrementați N).
Asta e; acesta este de fapt Fisher-Yates amestecă, ați putea face acest lucru la cerere (cum am scris-o), sau puteți face toate amestecurile la momentul configurarii (și doar citiți lucruri de pe listă atunci când generați ID-uri).
Acest lucru este mai puțin eficient decât ideea FPE - atât pentru că configurarea este mai implicată, cât și pentru că trebuie să păstrați o listă mare de ID-uri în jur. Pe de altă parte, este mult mai ușor de implementat decât să încerci să implementezi FF1 de la zero...
[1]: Algoritmii de criptare pentru păstrarea formatului au, de asemenea, o „ajustare”; ați dori să păstrați o valoare fixă (de exemplu, șirul gol); o modificare oferă un serviciu de care utilizarea dvs. specifică nu are nevoie.