Voglio mappare un numero intero (diciamo 32 bit) su un percorso valido. Il numero intero è un valore di autoincremento memorizzato nel database.
Inoltre, non voglio che nessuna cartella abbia più di N sottocartelle. Questo perché in WIN-NTFS (ad esempio) dopo un numero specifico (circa 1000) le cose stanno andando molto lentamente.
Quindi ho ideato un modello in cui ogni intero è mappato a hex groupped in due cifre. Ciò crea 4 cartelle per ogni intero
Ad esempio:
1 -> '00/00/00/01'
2000 -> '00/00/07/D0'
70000 -> '00/01/11/70'
etc
Tutto bello e bene.
Ma se si nota dopo aver creato le prime 257 voci
the folder '00/00/00' will have 256 entries ('00' to 'FF')
folder '00/00/01' will have one entry
folder '00/00' will have 2 entries ('00' and '01')
and last folder '00' will have just one entry.
Il grafico è altamente sbilanciato, il SO per trovare finalmente la cartella '00 / 00/00/55 'dovrà cercare tra 1 + 1 + 2 + 256 = 260 voci. Se il grafico fosse bilanciato sarebbe una ricerca di 4 * Pow (257,1 / 4) = ~ 16 voci
E la mia domanda è:
È comunque possibile trasformare il numero intero A in un intero A che ha le seguenti proprietà:
- È la trasformazione 1: 1
- Può essere invertito (per ogni A 'posso trovare facilmente A)
- Per ogni 1..N, creando cartelle usando il valore esadecimale A ', ciascuna cartella non ha più di voci Pow (N, 1/4)
EDIT: Ho provato i due codici. Il problema è che le funzioni di crypt emettono l'intera gamma a 32 bit. Voglio dire dopo 1000 incrementi e dopo ogni byte ha un valore casuale, la cartella radice ha 256 diversi valori (sottocartelle) e ognuno di essi ha 1 o 2 voci. È la stessa situazione con cui ho iniziato. È solo inverso