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.

È stato utile?

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++;
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top