如何在android中生成字符串输入的唯一哈希码...?

时间:2011-05-25 06:56:33

标签: java android hash hashmap

我想为android中的字符串生成一个唯一的哈希码。 是否有任何预定义库或我们必须手动生成。如果有任何正文,请提供链接或代码。

8 个答案:

答案 0 :(得分:59)

这取决于你的意思:

  • 如前所述String.hashCode()为您提供32位哈希码。

  • 如果您想要(比方说)一个64位哈希码,您可以自己轻松实现它。

  • 如果您需要String的加密哈希,Java加密库包括MD5,SHA-1等的实现。您通常需要将String转换为字节数组,然后将其提供给哈希生成器/摘要生成器。例如,请参阅@Bryan Kemp的回答。

  • 如果你想要一个保证唯一哈希码,那你就不走运了。哈希和哈希码是非唯一的。

长度为N的Java字符串具有65536 ^ N个可能的状态,并且需要一个带有16 * N位的整数来表示所有可能的值。如果你编写一个产生较小范围的整数(例如小于16 * N位)的哈希函数,你最终会发现多个String哈希到同一个整数的情况;即,哈希码不能是唯一的。这被称为Pigeonhole Principle,并且有一个直接的数学证明。 (你不能打数学并获胜!)

但如果“非常独特”的非唯一性很小的可能性是可以接受的,那么加密哈希就是一个很好的答案。数学将告诉你哈希必须有多大(即多少位)来实现给定(足够低)的非唯一性概率。

答案 1 :(得分:34)

这是我用来创建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;
        }
}

答案 2 :(得分:7)

String input = "some input string";
int hashCode = input.hashCode();
System.out.println("input hash code = " + hashCode);

答案 3 :(得分:3)

您可以使用此代码生成给定字符串的代码。

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

答案 4 :(得分:2)

我使用这个我测试它作为我的EhCacheManager内存映射的关键....

我认为它更干净

   /**
     * 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 "";
        }
    }

我正在使用maven,但这是罐子 的公地编解码器-1.9.jar

答案 5 :(得分:1)

几行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));
}

答案 6 :(得分:0)

让我们来看看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;
}

上面的代码块来自java.lang.String类。正如您所看到的,它是一个32位哈希码,如果您在小规模的数据上使用它,它就足够了。如果您正在寻找超过32位的哈希码,您可能想要查看此链接: http://www.javamex.com/tutorials/collections/strong_hash_code_implementation.shtml

答案 7 :(得分:0)

对我而言,它起作用了

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