Costruisci un hash basato sulla seguente formula ...
2 A(d) + B(d) + 1
A (d) è un hash della data nell'intervallo compreso tra 0 e 2.
B (d) è il bit meno significativo di una rappresentazione del numero del giorno della data.
Poiché i valori consecutivi di 2 A (d) non differiscono mai esattamente di 1 (o di qualsiasi numero dispari), e poiché i valori consecutivi di B (d) differiscono sempre di 1, i valori consecutivi del risultato combinato non sono mai uguali.
Il modo più semplice per calcolare una A (d) imprevedibile adatta è probabilmente utilizzare un algoritmo di hash standard, ma prendere il risultato modulo 3. Gli algoritmi di hash generalmente danno un risultato nell'intervallo 0 .. (2 ^ n) -1 (o per aritmetica firmata, -2 ^ (n-1) .. (2 ^ (n-1)) - 1). Se hai degli hash firmati, assicurati di utilizzare un modulo / resto che non dia mai risultati negativi, o di correggere per quello. Modulo originale o resto per arrotondamento divisione all'infinito negativo, fornire sempre risultati non negativi. I rimanenti per gli altri schemi di arrotondamento delle divisioni, come lo schema comune di "troncamento" (verso zero), potrebbero richiedere controlli per correggerlo. C e C ++ lasciano definito lo schema di arrotondamento della divisione definito dall'implementazione, quindi il comportamento resto / modulo per i valori negativi è definito in modo simile all'implementazione.
C'è un piccolo pregiudizio usando modulo per convertire in un intervallo di 0..2, ma ciò è inevitabile - 2 ^ n valori di dominio distinti non possono essere equamente condivisi per valori di 3 intervalli. Il bias sarà piccolo, tuttavia, se n è qualcosa che probabilmente vedrai in pratica (32 o 64 bit).