web-dev-qa-db-fra.com

Comment générer un code de hachage unique pour la saisie de chaînes dans Android ...?

Je voulais générer un code de hachage unique pour une chaîne dans Android. Y at-il une bibliothèque prédéfinie est là ou nous devons générer manuellement. S'il vous plaît tout organisme si sait s'il vous plaît présenter un lien ou une substance de code.

47
Shashikant

Cela dépend de ce que vous voulez dire:

  • Comme mentionné précédemment, String.hashCode() vous donne un code de hachage de 32 bits.

  • Si vous voulez (par exemple) un hashcode 64 bits, vous pouvez facilement l'implémenter vous-même.

  • Si vous voulez un hachage cryptographique d'une chaîne, les bibliothèques de crypto Java comprennent les implémentations de MD5, SHA-1, etc.). Vous devrez généralement transformer cette chaîne en tableau d'octets, puis transmettez-le au générateur de hachage/générateur de condensé.Par exemple, voir la réponse de Bryan Kemp.

  • Si vous voulez un code de hachage unique garanti, vous n'avez pas de chance. Les hachages et les codes de hachage ne sont pas uniques.

A Java La chaîne de longueur N a 65536 ^ N états possibles et nécessite un entier avec 16 * N bits pour représenter toutes les valeurs possibles. Si vous écrivez une fonction de hachage qui produit un entier avec une plage plus petite (par exemple, inférieure à 16 * N bits), vous trouverez éventuellement des cas où plusieurs hachages de chaîne ont le même entier; c'est-à-dire que les codes de hachage ne peuvent pas être uniques. C'est ce qu'on appelle le principe de Pigeonhole , et il existe une preuve mathématique simple. (Vous ne pouvez pas combattre les maths et gagner!)

Mais si "probablement unique" avec une très petite chance de non-unicité est acceptable, alors les hachages cryptographiques sont une bonne réponse. Le calcul vous dira quelle doit être la taille (c’est-à-dire combien de bits) du hash pour obtenir une probabilité donnée (assez faible) de non-unicité.

59
Stephen C

C’est une classe que j’utilise pour créer des hachages Message Digest

import Java.security.MessageDigest;
import Java.security.NoSuchAlgorithmException;

public class Sha1Hex {

    public String makeSHA1Hash(String input)
            throws NoSuchAlgorithmException, UnsupportedEncodingException
        {
            MessageDigest md = MessageDigest.getInstance("SHA1");
            md.reset();
            byte[] buffer = input.getBytes("UTF-8");
            md.update(buffer);
            byte[] digest = md.digest();

            String hexStr = "";
            for (int i = 0; i < digest.length; i++) {
                hexStr +=  Integer.toString( ( digest[i] & 0xff ) + 0x100, 16).substring( 1 );
            }
            return hexStr;
        }
}
34
Bryan Kemp
String input = "some input string";
int hashCode = input.hashCode();
System.out.println("input hash code = " + hashCode);
8
Boris Pavlović

Vous pouvez utiliser ce code pour générer un code pour une chaîne donnée.

int hash = 7;
for (int i = 0; i < strlen; i++) {
    hash = hash*31 + charAt(i);
}
3
Manmohan Soni

J'utilise ceci je l'ai testé comme clé de mon EhCacheManager carte de mémoire ....

C'est plus propre je suppose

   /**
     * Return Hash256 of String value
     *
     * @param text
     * @return 
     */
    public static String getHash256(String text) {
        try {
            return org.Apache.commons.codec.digest.DigestUtils.sha256Hex(text);
        } catch (Exception ex) {
            Logger.getLogger(HashUtil.class.getName()).log(Level.SEVERE, null, ex);
            return "";
        }
    }

j'utilise maven mais c'est le pot commons-codec-1.9.jar

2
shareef

Quelques lignes de code Java.

public static void main(String args[]) throws Exception{
       String str="test string";
       MessageDigest messageDigest=MessageDigest.getInstance("MD5");
       messageDigest.update(str.getBytes(),0,str.length());
       System.out.println("MD5: "+new BigInteger(1,messageDigest.digest()).toString(16));
}
1
Durgpal Singh

Pour moi cela a fonctionné

   public static long getUniqueLongFromString (String value){
       return  UUID.nameUUIDFromBytes(value.getBytes()).getMostSignificantBits();
    }
0
Raluca Lucaci

Jetons un coup d'œil à la méthode stock hashCode ():

public int hashCode() {
    int h = hash;
    if (h == 0 && count > 0) {
        for (int i = 0; i < count; i++) {
            h = 31 * h + charAt(i);
        }
        hash = h;
    }
    return h;
}

Le bloc de code ci-dessus provient de la classe Java.lang.String. Comme vous pouvez le constater, il s’agit d’un code de hachage de 32 bits qui convient assez bien si vous l’utilisez sur une petite échelle de données. Si vous recherchez du code de hachage avec plus de 32 bits, vous pouvez vérifier ce lien: http://www.javamex.com/tutorials/collections/strong_hash_code_implementation.shtml

0
ngaspama