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)
String input = "some input string";
int hashCode = input.hashCode();
System.out.println("input hash code = " + hashCode);
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
141406 次 |
最近记录: |