Domanda: Quando si dispone di un GUID .NET per l'inserimento in una banca dati, la sua struttura è simile a questo:Localmente identificatore unico
60 bits of timestamp,
48 bits of computer identifier,
14 bits of uniquifier, and
6 bits are fixed,
----
128 bits total
Ora ho un problema con un GUID, perché è un numero a 128 bit, e alcuni dei DB che sto utilizzando supportano solo numeri a 64 bit.
Ora non voglio risolvere il dilemma utilizzando un valore bigint autoincrement, poiché voglio essere in grado di eseguire la replica offline.
Così ho avuto l'idea di creare una classe identificatore univoca localmente, che è fondamentalmente un GUID ridimensionato a un valore a 64 bit.
sono arrivato fino a questo:
day 9 bit (12*31=372 d)
year 8 bit (2266-2010 = 256 y)
seconds 17 bit (24*60*60=86400 s)
hostname 12 bit (2^12=4096)
random 18 bit (2^18=262144)
------------------------
64 bits total
La mia domanda ora è: Il timestamp è praticamente fissato a 34 bit, lasciandomi con 64-34 = 30 bit per il numero casuale hostname +.
Ora la mia domanda: 1) Preferiresti aumentare il bit di hash dell'hostname e diminuire il bitsize casuale, o aumentare il bitsize casuale e diminuire il bit di hash dell'hostname.
2) Esiste un algoritmo hash che riduce ogni stringa in n bit? n idealmente = 12 o il più vicino possibile.
Ci sono vari approcci; Mi piace anche l'idea di un "id del nodo" con un timestamp (nessuna casualità). È possibile creare facilmente un ID nodo con qualsiasi numero di bit eseguendo XOR un hash crittografico (ad es. SHA1). Meno bit, più alta è la probabilità di una collisione di id di nodo, ovviamente. L'"unificatore" che hai menzionato è in realtà utilizzato da altri algoritmi di Guid per gestire gli orologi di sistema andando all'indietro, per mantenere i timestamp univoci per id di nodo. Ma alla fine della giornata, ti verrà difficile trovare una soluzione che garantisca meno collisioni rispetto alla pura casualità. Ricordate, questo è tutto .NET Guids ... –
Mentre la probabilità di 1/2^64 è ancora un numero molto piccolo, non mi piace il pensiero di un numero casuale puro. Ma ho pensato di omettere completamente l'hash dell'hostname e di aumentare il numero casuale a 30 bit. Ma questa non è una buona idea, perché per n client offline, ciò renderebbe la possibilità di collisione andare a 2^30 * n. Per 100 clienti, questo è solo circa uno su 10 milioni. Con molta sfortuna, si potrebbe semplicemente colpire il jackpot lì ... –
1/2^64 == 1 su 18 sett. (Un settilione == un trilione un trilione, o un milione di milioni di milioni). Se vai in modo completamente casuale ... –