2012-01-30 5 views
16

Devo generare ID univoci per la mia applicazione. Quando ho usato (UUID.randomUUID()).toString(), sto ottenendo un codice (pensando che questo sarà unico), che è molto lungo.Genera ID univoco

Non sono sicuro di quanto sarà unico, quando genereremo i codici con l'aiuto di Java Timestamp o randomstring.

Ho bisogno di generare codici univoci che sono solo di 8-10 caratteri di lunghezza (alfanumerici). Come ottenerlo? Sto usando il database MySQL.

La generazione di codice univoco sul lato del database è il modo migliore o possiamo generare codici brevi (ma unici) in Java?

Qualsiasi suggerimento con codice di esempio sarà molto utile.

+0

vuoi creare il tuo metodo per generare un ID univoco usando il timestamp? –

+0

È possibile ottenere un numero univoco e quindi incrementarlo di 1 ogni volta durante la memorizzazione dei record nel DB. – Ved

+2

@Sathish: Perché non ottenere la sottostringa() in base alla lunghezza desiderata e continuare a controllare se quella nuova è uguale a qualsiasi altra precedentemente assegnata. UUID è il modo migliore :-) Saluti –

risposta

21

Io uso metodo da commons-lang per raggiungere questo obiettivo:

import org.apache.commons.lang.RandomStringUtils; 

public static final int ID_LENGTH = 10; 

public String generateUniqueId() { 
    return RandomStringUtils.randomAlphanumeric(ID_LENGTH); 
} 

Se si utilizza Maven, assicurarsi di aver aggiunto commons-lang dipendenze del progetto:

<dependency> 
    <groupId>commons-lang</groupId> 
    <artifactId>commons-lang</artifactId> 
    <version>2.6</version> 
</dependency> 

genera codice univoco su il lato del database è il modo migliore o possiamo generare codici brevi (ma unici) in java?

Spetta a te e al tuo progetto. La generazione di ID è parte della logica aziendale? Se sì e tutta la logica scritta su Java, scrivilo su Java. Se tutto o parte della logica è delegata al database, quindi generare l'ID lì (ma in questo caso si avrà una forte dipendenza da un particolare database).

+0

Ciao .. Grazie mille .. Usando randomAlphanumeric(), stiamo ottenendo dei codici secondo la lunghezza che desideriamo .. ma unici ?? –

+1

'randomAlphanumeric()' genera una stringa con caratteri casuali e nella maggior parte dei casi è univoco (si può anche provare a eseguirlo in un ciclo e generare nuovi a meno che non esista). –

+0

Grazie .. finalmente ho usato RandomStringUtils.randomAlphanumeric (10) per generare il codice e verificare che il codice esista nel database. Se non esiste, lo sto usando come codice univoco .. –

5

La generazione di codice univoco sul lato del database è il modo migliore o possiamo generare codici brevi (ma unici) in Java?

I database sono progettati per essere in grado di generare ID univoci laddove necessario. Dubito che qualsiasi cosa tu (o io) possa codificare sarebbe una variante "migliore" di quello.

+0

Grazie. In tal caso, puoi fornirmi alcuni esempi su come generare ID univoci per i database MySQL. –

+2

Prova [uno di questi] (http://www.google.com.au/search?q=generate+unique+IDs+for+MySQL&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:en- Stati Uniti: client ufficiale & = firefox-a). Non uso DB su base giornaliera e non ho mai utilizzato MySQL. –

+0

Grazie per aver suggerito google :) –

7

Avete qualche limite specifico da tenere in considerazione? Come l'unicità delle applicazioni incrociate? Perché altrimenti, MySQL è abbastanza capace di generare ID da solo, tutto quello che devi fare è definire una colonna autoincrement e non specificarla al momento dell'insediamento (cioè, inserire un valore NULL) - questo farà sì che MySQL lo riempia con il prossimo ID disponibile, unico e che non richiede lavoro da parte tua.

Non sarà una stringa alfanumerica (che non sono sicuro se hai specificato come requisito o restrizione), ma se tutto ciò che ti serve è univocità, è più che sufficiente. 8 - 10 caratteri alfanumerici non sono sufficienti a garantire univocità in una stringa generata casualmente, quindi è necessario eseguire un controllo di inserimento nel database.

1

Ho scritto un servizio semplice che può generare numeri semi-univoci a 64 bit non sequenziali. Può essere distribuito su più macchine per ridondanza e scalabilità. Usa ZeroMQ per la messaggistica.Per ulteriori informazioni su come funziona un'occhiata alla pagina di GitHub: zUID

0

Prendere un'occhiata a: UIDGenerator.java

è possibile personalizzarla (unica per elaborare solo, o del mondo), è facile da usare e veloce:

private static final UIDGenerator SCA_GEN = new UIDGenerator(new ScalableSequence(0, 100)); 
....... 
    SCA_GEN.next(); 

È possibile modificare l'implementazione di ridurre le dimensioni della ID (e aggiungere altri compromessi)

vedere i miei risultati di benchmarking a:

http://zoltran.com/roller/zoltran/entry/generating_a_unique_id

oppure eseguirli da soli.

+0

Nel caso in cui io uso UID Generator sarà univoco nell'applicazione java con più cluster, l'ID sarà univoco anche se il server viene riavviato ?? –

0

La domanda se una parte generazione id essere fatto in database o java fine: Questa domanda si deve rispondere da te a seconda delle esigenze della vostra applicazione:

1) Un modo è quello di andare da System.currenTimeMillis (). Ma se la tua applicazione funzionerà in multi-cluster env, potresti finire con valori duplicati.

http://www2.sys-con.com/itsg/virtualcd/java/archives/0512/Westra/index.html

2) Un altro modo è quello di utilizzare UUID Generator .E vi aiuterà nel caso in cui si dispone di diversi database che devono essere uniti. Usando questo mehtod non devi preoccuparti della duplicazione dell'id quando si uniscono i database.

https://marketplace.informatica.com/solutions/mapping_uuid_using_java

Ci possono essere altri fattori che si può prendere in considerazione. Secondo la tua domanda il metodo UUID andrà.