Domanda

Come generare ID univoco che viene intero in Java che non indovinare il numero successivo?

È stato utile?

Soluzione

Come unico ha bisogno di essere?

Se è unica solo all'interno di un processo, quindi è possibile utilizzare un AtomicInteger e chiamata incrementAndGet() ogni volta che è necessario un nuovo valore.

Altri suggerimenti

int uniqueId = 0;

int getUniqueId()
{
    return uniqueId++;
}

Aggiungi synchronized se si vuole che sia thread-safe.

E 'facile se si è un po' costretti.

Se si dispone di un thread, è sufficiente utilizzare uniqueID ++; Assicurarsi di conservare l'attuale uniqueID quando si esce.

Se si dispone di più thread, un comune sincronizzato generateUniqueID metodo funziona (implementato lo stesso come sopra).

Il problema è quando si dispone di molte CPU -. Sia in un cluster o alcune operazioni di configurazione distribuita come un gioco peer-to-peer

In questo caso, si può generalmente combinare due parti in modo da formare un unico numero. Per esempio, ogni processo che genera un ID univoco può avere il proprio numero di identificazione a 2 byte assegnato e poi combinarlo con un uniqueID ++. Qualcosa di simile:

return (myID << 16) & uniqueID++

Può essere difficile distribuire la parte "myID", ma ci sono alcuni modi. Si può solo prendere uno su un database centralizzato, richiedere un ID univoco da un server centralizzato, ...

Se si ha un lungo invece di un Int, uno dei trucchi più comuni è quello di prendere il dispositivo di identificazione (UUID) di ETH0, che è garantito per essere unico a un server - poi basta aggiungere su un numero di serie

Se si intende veramente intero piuttosto che int:

Integer id = new Integer(42); // will not == any other Integer

Se si desidera qualcosa di fuori visibile una JVM per altri processi o per l'utente, persistente, o una miriade di altre considerazioni, poi ci sono altri approcci, ma senza contesto si sono probabilmente meglio utilizzando utilizzando il built-in unicità di identità di un oggetto all'interno del vostro sistema.

Basta generare ID e verificare se è già presente o meno nel vostro elenco di ID generati.

Avete bisogno di essere;

  • unica tra due JVM in esecuzione a lo stesso tempo.
  • , anche se unica JVM viene riavviato.
  • thread-safe.
  • nullo supporto? in caso contrario, l'uso int o lungo.
 import java.util.UUID;

 public class IdGenerator {
    public static int generateUniqueId() {      
        UUID idOne = UUID.randomUUID();
        String str=""+idOne;        
        int uid=str.hashCode();
        String filterStr=""+uid;
        str=filterStr.replaceAll("-", "");
        return Integer.parseInt(str);
    }

    // XXX: replace with java.util.UUID

    public static void main(String[] args) {
        for (int i = 0; i < 5; i++) {
            System.out.println(generateUniqueId());
            //generateUniqueId();
        }
    }

}

Spero che questo ti aiuta.

Unico in qualsiasi momento:

int uniqueId = (int) (System.currentTimeMillis() & 0xfffffff);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top