Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/392.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在android中为字符串输入生成唯一的哈希代码。。。?_Java_Android_Hash_Hashmap - Fatal编程技术网

Java 如何在android中为字符串输入生成唯一的哈希代码。。。?

Java 如何在android中为字符串输入生成唯一的哈希代码。。。?,java,android,hash,hashmap,Java,Android,Hash,Hashmap,我想为android中的字符串生成一个唯一的哈希代码。 是否有任何预定义的库存在,或者我们必须手动生成。请任何知道的人提供一个链接或代码。这是我用来创建消息摘要哈希的类 String input = "some input string"; int hashCode = input.hashCode(); System.out.println("input hash code = " + hashCode); import java.security.MessageDigest; import

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

这是我用来创建消息摘要哈希的类

String input = "some input string";
int hashCode = input.hashCode();
System.out.println("input hash code = " + hashCode);
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;
        }
}
import java.security.MessageDigest;
导入java.security.NoSuchAlgorithmException;
公共类Sha1Hex{
公共字符串makeSHA1Hash(字符串输入)
抛出NoSuchAlgorithmException、UnsupportedEncodingException
{
MessageDigest md=MessageDigest.getInstance(“SHA1”);
md.reset();
byte[]buffer=input.getBytes(“UTF-8”);
md.update(缓冲区);
字节[]摘要=md.digest();
字符串hextr=“”;
for(int i=0;i
这取决于您的意思:

  • 如前所述,
    String.hashCode()
    提供32位哈希代码

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

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

  • 如果你想要一个保证唯一的散列码,那你就倒霉了。哈希和哈希代码是非唯一的

长度为N的Java字符串具有
65536^N
可能的状态,并且需要一个具有
16*N
位的整数来表示所有可能的值。如果编写的哈希函数生成的整数范围较小(例如小于
16*N
位),则最终会发现多个字符串哈希到同一整数的情况;i、 e.哈希代码不能是唯一的。这就是所谓的,有一个直接的数学证明。(你不能和数学较量然后赢!)


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

您可以使用此代码为给定字符串生成has代码

int hash = 7;
for (int i = 0; i < strlen; i++) {
    hash = hash*31 + charAt(i);
}
int hash=7;
对于(int i=0;i
让我们看看stock hashCode()方法:

public int hashCode(){
int h=散列;
如果(h==0&&count>0){
for(int i=0;i
上面的代码块来自java.lang.String类。正如您所看到的,如果您在小规模的数据上使用它,它是一个32位哈希代码,这已经足够公平了。如果您正在查找32位以上的哈希代码,可能需要签出此链接:
几行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));
}

我使用它作为我的
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,但这是jar commons-codec-1.9.jar

对我来说很有效

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

字符串的内置哈希代码呢?唯一哈希代码?为什么?你认为这是怎么可能的?请详细说明。唯一的散列码是不可能的(除非它们可以有无限长),因为可能有无限多个字符串。这是完全错误的。我可以想出五种方法来创建一个独特的哈希代码。这一切都是从重写hashCode()函数开始的。无论如何,最后一条评论有点过于简单:如果在一个足够大的域上使用健壮的生成器创建哈希,则发生冲突的可能性可能非常小。如果重写hashCode以使用线程安全增量,则可以具有唯一的值。然而,大多数情况下,当正确实现时,概率方面并不重要。你不知道OP的上下文是什么。绝对不知道。假设他说“独一无二”并不意味着这是一个巨大的延伸。无论如何,挑战仍然存在:告诉我们如何做。@Vladimir-根据定义,没有哈希代码是唯一的!哈希代码需要分布均匀,唯一性的想法是对OP的错误理解。如果哈希代码是唯一的,那将是一个地狱般的压缩算法。试试看”Z@S.ME“和”Z@RN.E“使用hashCode时,它们具有相同的哈希值;)@Simon,刚才在.NET中运行了你的示例,因为我很好奇。它们必须有不同的基本散列算法,因为它们不完全匹配。也许OP所指的唯一性是:给定输入字符串的唯一性(不应为同一字符串生成两个哈希)。64位哈希代码:为了完整性,如果您想要64位哈希,请参见Sfussengenger中的,32位哈希只能唯一地标识具有2个字符的字符串?基本上。。。对(假设character==arbitral
char
value。如果character表示Unicode码点…或(比如)ASCII码点,则会变得有点复杂。)为什么从7开始?
   public static long getUniqueLongFromString (String value){
       return  UUID.nameUUIDFromBytes(value.getBytes()).getMostSignificantBits();
    }