如何生成一个独特的散列码在Android的stringinput…?
我想为Android中的string生成一个唯一的哈希码。 有没有预定义的库,或者我们必须手动生成。 请任何身体如果知道请提供一个链接或代码的东西。
这取决于你的意思:
-
正如前面提到的
String.hashCode()
给你一个32位的哈希码。 -
如果你想(说)一个64位的哈希码,你可以很容易地实现它自己。
-
如果你想要一个string的encryption哈希,Javaencryption库包括MD5,SHA-1等的实现。 您通常需要将string转换为字节数组,然后将其提供给哈希生成器/摘要生成器。 例如,请参阅@Bryan Kemp的答案。
-
如果你想要一个保证唯一的哈希码,你是运气不好。 散列和散列码是非唯一的。
长度为N的Javastring具有65536 ^ N
可能的状态,并且需要具有16 * N
位的整数来表示所有可能的值。 如果你编写一个散列函数来产生一个范围较小的整数(例如less于16 * N
位),你最终会发现多个String散列到同一个整数的情况。 即哈希码不能是唯一的。 这被称为鸽巢原理 ,并有一个直接的mathcertificate。 (你不能打math,赢!)
但是,如果“非常唯一”的可能性非常小,那么encryption哈希值就是一个很好的答案。 math会告诉你散列必须有多大(即有多less位)才能达到给定(足够低)的非唯一性概率。
这是我用来创buildMessage 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; } }
String input = "some input string"; int hashCode = input.hashCode(); System.out.println("input hash code = " + hashCode);
你可以使用这个代码来生成给定string的代码。
int hash = 7; for (int i = 0; i < strlen; i++) { hash = hash*31 + charAt(i); }
几行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)); }
让我们来看看股票的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