2015-10-06 154 views
1

我有一个单词表,其中来自20级的〜68000个单词,位于0xf.at处,并且想要散列两个单词以获得散列。然后将该散列与现有散列进行比较,直到找到两个单词。MD5哈希更快

我已经在java中尝试过了,但我没有意识到它是慢的。

import java.io.*; 

public class Main { 

public static void main(String[] args) throws FileNotFoundException, 
     IOException { 

    try (BufferedReader br = new BufferedReader(new FileReader("E:/Trojan/Desktop/wordlist.txt"))) { 
     StringBuilder sb = new StringBuilder(); 
     String line = br.readLine(); 
     Hash h = new Hash(); 
     String myHash = "cd48323bcf01557f5deadc2ec301affb"; 
     while (line != null) { 
      sb.append(line); 
      sb.append(System.lineSeparator()); 
      line = br.readLine(); 
     } 
     String everything = sb.toString(); 
     String lines[] = everything.split("\\r?\\n"); 
     for (int j = 1; j <= 68848; j++) { 
      for (int i = 1; i <= 68847; i++) { 
       //System.out.println(i+":"+lines[i]+" "+j+":"+lines[j]); 
       if (h.getHash(lines[i]+lines[j], "MD5") == myHash){ 
        System.out.println(lines[i]+lines[j]); 
        break; 
       } 
      } 
     } 
    } 
} 
} 

和MD5哈希函数我从计算器的〔实施例了:

public class Hash { 
/** 
* 
* @param txt, text in plain format 
* @param hashType MD5 OR SHA1 
* @return hash in hashType 
*/ 
public static String getHash(String txt, String hashType) { 
    try { 
       java.security.MessageDigest md = java.security.MessageDigest.getInstance(hashType); 
       byte[] array = md.digest(txt.getBytes()); 
       StringBuffer sb = new StringBuffer(); 
       for (int i = 0; i < array.length; ++i) { 
        sb.append(Integer.toHexString((array[i] & 0xFF) | 0x100).substring(1,3)); 
      } 
       return sb.toString(); 
     } catch (java.security.NoSuchAlgorithmException e) { 
      //error action 
     } 
     return null; 
} 

public static String md5(String txt) { 
    return Hash.getHash(txt, "MD5"); 
} 

public static String sha1(String txt) { 
    return Hash.getHash(txt, "SHA1"); 
} 
} 

我怎样才能得到这个更快?

+1

为什么不使用java.security.MessageDigest?这些可能是优化的。 – mszymborski

+1

第一个问题 - 你正在比较字符串引用和'==',所以它不会匹配。 –

回答

0

在方法getHash中创建了太多的临时对象。尝试减少。例如。

private static final char[] HEX ={'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f',}; 
public static String getHash(String txt, MessageDigest md) { 
    byte[] array = md.digest(txt.getBytes()); 
    char[] result = new char[array.length*2]; 
    for (int i = 0; i < array.length; ++i) { 
     byte b = array[i]; 
     result[2*i] = HEX[(b&0x0f0)>>>4]; 
     result[2*i+1] = HEX[b&0x0f]; 
    } 
    return new String(result); 
} 

编辑 而且你不需要String对象的。您应该返回byte []并使用Arrays.equals方法。