我想为输入的字符串在Android中生成唯一的哈希码。 是否有预定义的库可用或者我们需要手动生成?如果有人知道,请提供一个链接或者代码片段。
我想为在Android中输入的字符串生成唯一的哈希码,是否有预定义的库可用,或者我们需要手动生成?如果有人知道,请提供链接或代码示例。我想为输入的字符串在Android中生成唯一的哈希码。 是否有预定义的库可用或者我们需要手动生成?如果有人知道,请提供一个链接或者代码片段。
我想为在Android中输入的字符串生成唯一的哈希码,是否有预定义的库可用,或者我们需要手动生成?如果有人知道,请提供链接或代码示例。这取决于你的意思:
如先前提到的,String.hashCode()
返回一个32位的哈希码。
如果您想要(比如)一个64位的哈希码,您可以轻松地自己实现它。
如果您想要一个字符串的加密哈希值,Java密码库中包括MD5、SHA-1等实现。通常您需要将字符串转换为字节数组,然后将其提供给哈希生成器/摘要生成器。例如,请参见@Bryan Kemp的回答。
如果您想要一个保证唯一的哈希码,则不会成功。 哈希和哈希码是非唯一的。
长度为N的Java字符串有65536 ^ N
种可能的状态,并且需要一个具有16 * N
位的整数来表示所有可能的值。 如果编写生成范围较小(例如小于16 * N
位)整数的哈希函数,则最终会发现多个字符串散列到相同的整数上;即散列码不能唯一。 这称为鸽洞原理,并且有一个直接的数学证明。 (您不能与数学斗争并赢!)
但是,如果“可能唯一”并具有极小的非唯一性几率是可以接受的,则加密哈希值是一个好答案。 数学将告诉您哈希必须有多大(即需要多少位),才能达到给定(足够低的)非唯一性概率。
char
值。如果character表示Unicode代码点......或(例如)ASCII代码点,则会变得更加复杂。) - Stephen C这是我用来创建消息摘要哈希的类
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);
我使用这个作为我的 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 "";
}
}
对我来说,它起作用了。
public static long getUniqueLongFromString (String value){
return UUID.nameUUIDFromBytes(value.getBytes()).getMostSignificantBits();
}
int hash = 7;
for (int i = 0; i < strlen; i++) {
hash = hash*31 + charAt(i);
}
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;
}