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

Sha*_*ant 50 java hash android hashmap

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

Ste*_*n C 59

这取决于你的意思:

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

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

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

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

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

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


Bry*_*emp 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;
        }
}
Run Code Online (Sandbox Code Playgroud)


Bor*_*vić 8

String input = "some input string";
int hashCode = input.hashCode();
System.out.println("input hash code = " + hashCode);
Run Code Online (Sandbox Code Playgroud)

  • 如果哈希码是唯一的,那就是压缩算法的一个地狱. (28认同)
  • @Vladimir - 根据定义,没有哈希码被定义为唯一!Hashcode需要很好地分布,唯一性的想法是对OP的错误理解. (13认同)
  • 例如,尝试"Z@S.ME"和"Z@RN.E"时,使用hashCode时它们具有相同的哈希值;) (8认同)