Come posso assemblare bit in un lungo per creare un ID univoco?
Domanda
Vorrei scrivere un'utilità che mi fornirà un ID relativamente univoco in Java. Qualcosa di abbastanza semplice, come x bit da timestamp + y bit da numero casuale.
Quindi, come dovrei implementare il seguente metodo:
long getUniqueID()
{
long timestamp = System.currentTimeMillis();
long random = some random long
...
return id;
}
BONUS
Qualche suggerimento per altre informazioni facilmente ottenibili che potrei usare per formare il mio ID?
nota: sono a conoscenza di GUID e so che Java ha una classe UUID, ma non voglio qualcosa che sia lungo 128 bit.
Soluzione
Basta tagliare i bit che non ti servono:
return java.util.UUID.randomUUID().getLeastSignificantBits();
Altri suggerimenti
Quello che stai cercando di fare è creare una funzione hash che combina due valori lunghi in un singolo valore lungo. In questo caso, la uniformità della funzione hash sarà della massima importanza poiché le collisioni in i valori ID univoci creati sono inaccettabili. Tuttavia, se puoi confrontare i valori di hash con identificatori precedentemente creati, le collisioni possono essere risolte modificando l'hash fino a quando non si verificano collisioni.
Ad esempio, potresti prendere il timestamp ed eseguire un exclusive-or (usando l'operatore punto di inserimento in Java) con il valore casuale. Se viene rilevata una collisione, aggiungine una al risultato.
Se univoco nella stessa JVM è sufficiente, qualcosa del genere dovrebbe fare il suo lavoro.
public class UniqueID {
static long current= System.currentTimeMillis();
static public synchronized long get(){
return current++;
}
}