web-dev-qa-db-fra.com

Obtenir une valeur entière unique à partir de la chaîne

J'ai différentes chaînes uniques dans le même format. La chaîne ressemble à ceci axf25!j&809>-11~dc et je veux obtenir une valeur entière unique à partir de cette chaîne. Chaque fois que cette valeur doit être la même et dépend de la chaîne. J'ai essayé de convertir chaque caractère de la chaîne en int puis je résume les caractères les uns aux autres. Mais si j'ai 2 chaînes avec le même ensemble de symboles, il renvoie des valeurs entières qui sont égales. Donc ça ne me convient pas. Comment puis-je générer une valeur entière unique à partir d'une chaîne unique?

MISE À JOUR:

Après avoir considéré toutes les solutions données, j'ai décidé de créer une fonction qui génère des valeurs entières uniques. J'espère que cela exclut les collisions.

public int getUniqueInteger(String name){
    String plaintext = name;
    int hash = name.hashCode();
    MessageDigest m;
    try {
        m = MessageDigest.getInstance("MD5");
        m.reset();
        m.update(plaintext.getBytes());
        byte[] digest = m.digest();
        BigInteger bigInt = new BigInteger(1,digest);
        String hashtext = bigInt.toString(10);
        // Now we need to zero pad it if you actually want the full 32 chars.
        while(hashtext.length() < 32 ){
          hashtext = "0"+hashtext;
        }
        int temp = 0;
        for(int i =0; i<hashtext.length();i++){
            char c = hashtext.charAt(i);
            temp+=(int)c;
        }
        return hash+temp;
    } catch (NoSuchAlgorithmException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return hash;
}
18
Nolesh

Vous ne pouvez pas générer des ints entièrement uniques à partir de chaînes suffisamment longues car il y a plus de chaînes de 10 caractères que d'entiers 32 bits .

En ce qui concerne les solutions non uniques, vous pouvez utiliser la fonction standard hashCode, son implémentation en Java est assez bonne. Pour des choses plus complexes, vous pouvez envisager de calculer le hachage cryptographique ( SHA-2 , MD5 , etc.)

14
dasblinkenlight

Vous pouvez simplement utiliser String.hashCode() (par exemple mystring.hashCode()) pour vous donner un certain degré d'unicité, mais vous devez vous assurer que vous pouvez gérer les collisions.

10
Adrian Merrall

Vous ne pouvez pas garantir des valeurs entières uniques à partir de différentes chaînes car il existe plus de représentations de chaînes possibles que d'entiers. Vous pouvez utiliser un algorithme de hachage bien connu/défini pour minimiser les risques de collision. Vous devriez regarder MD5 ou SHA.

La classe Java classe MessageDigest devrait être d'une certaine utilité.

5
Jeff Storey

Vous pouvez essayer avec du code:

import Java.math.BigInteger;

public static BigInteger stringToBigInteger(String text) {
    BigInteger bigInt = new BigInteger(text.getBytes());
    return bigInt;
}

merci.

1
searching9x

Traitez les cordes comme une base 0x110000 représentation d'un entier (vous pouvez vous en tirer avec une base plus petite si vous savez que la plage de caractères est limitée). Convertissez en BigInteger.

0
jason