Question

Je veux générer l'identifiant unique à chaque fois de i appelle Methode generateCustumerId (). L'identifiant généré doit être de 8 caractères ou moins de 8 caractères. Cette exigence est nécessaire parce que je dois le stocker dans un fichier de données et le schéma est déterminé à être de 8 caractères pour cet id.

Option 1 fonctionne très bien. Au lieu de l'option 1, je veux utiliser UUID. Le problème est que UUID génère un identifiant qui doit beaucoup de caractères. Est-ce que quelqu'un sait comment générer un identifiant unique qui est à moins de 99.999.999?

1

import java.util.HashSet;
import java.util.Random;
import java.util.Set;

public class CustomerIdGenerator {

private static Set<String> customerIds = new HashSet<String>();
private static Random random = new Random();

// XXX: replace with java.util.UUID
public static String generateCustumerId() {

    String customerId = null;
    while (customerId == null || customerIds.contains(customerId)) {
        customerId = String.valueOf(random.nextInt(89999999) + 10000000);
    }
    customerIds.add(customerId);
    return customerId;
}

}

option2 génère un identifiant unique qui est trop long

 public static String generateCustumerId() {
    String ownerId = UUID.randomUUID().toString();
    System.out.println("ownerId " + ownerId);
    return ownerId
}
Était-ce utile?

La solution

Est-il besoin d'être unique ou aléatoire? Si elle n'a besoin que d'être unique, vous pouvez charger la valeur la plus élevée du datastore lorsque l'application est lancée (en supposant une seule application est en train d'écrire dans le fichier de données). Celui que vous avez votre valeur la plus élevée:

public class IdGenerator{
  private String value;

  public IdGenerator( String initial value ){
    this.value = value;
  }

  public synchronized String nextValue(){
    value = incrementValue( value );
    return value;
  }

  private static String nextValue( String currentValue ){
    // Somehow increment the value.
    return incrementedValue;
  }

}

En fonction de ce que les personnages vous permettent de vous UUID cela peut se faire de différentes façons. Je lirais le dernier caractère de la chaîne en cours, vérifier si elle est le dernier caractère autorisé. Est-ce donc, incrémenter le 7 caractère et ainsi de suite. Sinon, incrémenter le dernier caractère.

Autres conseils

Peut-être Commons projet Id est d'une certaine utilité. Le de ( et leurs autres générateurs ainsi) prend un argument de longueur. Bien sûr, qui soutient vraiment juste une séquence (ce qui implique que vous devez savoir / déterminer le dernier identifiant le plus élevé sur le redémarrage de l'application).

Vous pouvez essayer quelque chose comme la somme de contrôle CRC32 du localtime ou un réseau aléatoire d'octets (CRC32 est intégré dans Java standard Library ).

Pas la meilleure solution dans le monde, mais que diriez-vous couper l'UUID à la longueur? Il ne sera pas unique au monde - juste être conscient que vous ne serez pas un identifiant unique au monde -. Mais il pourrait fonctionner pour localement unique

Gardez un compteur persistant qui incrémente d'une unité chaque fois qu'un nouvel ID est demandé.

Si le fichier de données est une table SQL, vous pouvez toujours sélectionner MAX (id) + 1, et l'utiliser, mais vous devez être absolument certain que vous ne courez pas dans les problèmes multi-tâches quand il faut de deux id en même temps (et ils ont tous deux la même valeur de MAX (id)). Notez que la plupart des bases de données ont un type natif conçu à cet effet et pour tout programme non trivial vous devez utiliser cette installation.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top