2016-05-14 58 views
0

我正在做一个项目,我有一个非常简单的哈希函数在Java中SHOULD读取每个“数据”(这是一个泛型类型是一个字符串或双按文件类型读取)字符,并将它们的值作为散列码使用的总和。 我以为我可以将每个字符转换为十六进制,然后“解码”或“parseInt”获得的字符串,但它不起作用,我不明白为什么。十六进制字符串阅读哈希功能在Java不工作

这里是我的方法:

public long HashFunction(T data){ 
     String bytes = data.toString(); 

     int value=0; 
     for (int i=0; i<bytes.length(); i++) 
      value = value + Integer.decode(Integer.toHexString(bytes.charAt(i) | 0x100000).substring(1)); 

     return (value%1583)%(size); 
     //1583 prime number not near to the power of 2, size is the size of the array of my hashtable 

    } 

,这里是我的错误,0038应该是一个 “8”:

Exception in thread "main" java.lang.NumberFormatException: For input string: "0038" 
    at java.lang.NumberFormatException.forInputString(Unknown Source) 
    at java.lang.Integer.parseInt(Unknown Source) 
    at java.lang.Integer.valueOf(Unknown Source) 
    at java.lang.Integer.decode(Unknown Source) 
    at dizionario_package.HashTable.HashFunction(HashTable.java:22) 
    at dizionario_package.HashTable.HashInsert(HashTable.java:29) 
    at dizionario_package.RecordReader.CreateHTFromFile(RecordReader.java:24) 
    at dizionario_package.proviamo.main(proviamo.java:8) 

而且,我敢肯定这错误是在这个函数,因为如果我使用java哈希码方法,它的工作原理。

在此先感谢。

+0

什么是你期待输出为8的输入值? – Sanjeev

回答

0

你需要告诉decode你正在使用十六进制。在0x前缀字符串。

value = Integer.decode("0x"+"10038".substring(1)); 
+0

它工作,谢谢<3 任何建议改善散列函数吗? – user3004162

+0

没问题。不知道你想要改进什么。如果它没有损坏,请不要修复它。 – GavinCattell