web-dev-qa-db-fra.com

Générer un identifiant unique

Je dois générer des identifiants uniques pour mon application. Quand j'ai utilisé (UUID.randomUUID()).toString(), je reçois un code (pensant que ce sera unique), ce qui est très long.

Je ne sais pas à quel point ce sera unique, lorsque nous générerons des codes à l'aide de Java Timestamp ou randomstring.

J'ai besoin de générer des codes uniques composés uniquement de 8-10 caractères (alphanumérique). Comment y arriver? J'utilise la base de données MySQL.

Est-ce la meilleure façon de générer un code unique côté base de données ou pouvons-nous générer des codes aussi courts (mais uniques) en Java?

Toute suggestion avec un exemple de code sera très utile.

17
user915303

J'utilise la méthode RandomStringUtils.randomAlphanumeric() de commons-lang pour y parvenir:

import org.Apache.commons.lang.RandomStringUtils;

public static final int ID_LENGTH = 10;

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

Si vous utilisez Maven, assurez-vous d'avoir ajouté commons-lang aux dépendances du projet:

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

Est-ce la meilleure façon de générer un code unique côté base de données ou pouvons-nous générer des codes aussi courts (mais uniques) en java?

C'est à vous et à votre projet. La génération d'identifiants fait-elle partie de la logique métier? Si oui et toute la logique écrite sur Java, alors écrivez-le sur Java. Si tout ou partie de la logique est déléguée à la base de données, indiquez donc id (mais dans ce cas, vous aurez une forte dépendance à une base de données particulière).

22
Slava Semushin

Avez-vous des limitations spécifiques à prendre en compte? Tels que l'unicité des applications croisées? Parce que sinon, MySQL est tout à fait capable de générer des identifiants par lui-même, il suffit de définir une colonne autoincrement et de ne pas la spécifier au moment de l'insertion (ce qui signifie insérer une valeur NULL), ce qui remplira MySQL. avec le prochain identifiant disponible, unique et ne nécessitant aucun travail de votre part.

Ce ne sera pas une chaîne alphanumérique (que je ne sais pas si vous avez spécifié une exigence ou une restriction), mais si vous avez seulement besoin d'unicité, c'est plus que suffisant. 8 à 10 caractères alphanumériques ne suffisent pas à garantir l'unicité dans une chaîne générée aléatoirement, vous devez donc effectuer une vérification d'insertion dans la base de données.

7
Naltharial

Est-ce la meilleure façon de générer un code unique côté base de données ou pouvons-nous générer des codes aussi courts (mais uniques) en Java?

Les bases de données sont conçues pour pouvoir générer des identifiants uniques, le cas échéant. Je doute que tout ce que vous (ou moi-même) pourriez coder serait une "meilleure" variante de cela.

5
Andrew Thompson

J'ai écrit un service simple qui peut générer des nombres semi-uniques non séquentiels longs de 64 bits. Il peut être déployé sur plusieurs machines à des fins de redondance et d'évolutivité. Il utilise ZeroMQ pour la messagerie. Pour plus d'informations sur son fonctionnement, consultez la page github: zUID

1
Majid Azimi

Regardez: UIDGenerator.Java

Vous pouvez le personnaliser (unique pour traiter uniquement, ou monde), il est facile à utiliser et rapide:

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

Vous pouvez modifier l'implémentation pour réduire la taille de l'ID (et ajouter d'autres compromis)

voir mes résultats d'analyse comparative à:

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

ou les exécuter vous-même.

0
user2179737

La question si une partie de la génération de l'identifiant doit être effectuée dans la base de données ou dans l'extrémité Java: vous devez répondre à cette question en fonction des besoins de votre application:

1) Une solution consiste à utiliser System.currenTimeMillis (). Mais si votre application fonctionnera en mode multi-cluster env, vous risquez de vous retrouver avec des valeurs en double.

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

2) Une autre solution consiste à utiliser UUID Generator. Il vous aidera si vous avez différentes bases de données à fusionner. En utilisant cette méthode, vous n'avez pas à vous soucier de la duplication de id lors de la fusion de bases de données.

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

Vous voudrez peut-être prendre en compte d’autres facteurs. Selon votre question, la méthode UUID ira.

0
Shweta Gulati