【问题标题】:MD5 Hash FasterMD5 哈希更快
【发布时间】:2016-01-03 14:57:07
【问题描述】:

我在 0xf.at 处有一个包含 20 级的约 68000 个单词的单词列表,并且想要对两个单词进行哈希处理以获得哈希值。然后将此哈希与现有哈希进行比较,直到找到这两个词。

我在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;
                }
            }
        }
    }
}
}

还有我从 stackoverflow 示例中获取的 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");
}
}

我怎样才能更快地做到这一点?

【问题讨论】:

  • 你为什么不使用java.security.MessageDigest?这些可能已经过优化。
  • 第一个问题 - 您将字符串引用与 == 进行比较,因此无论如何它不会匹配。

标签: java optimization hash md5


【解决方案1】:

您在方法 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 方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-26
    • 2012-08-17
    • 2013-06-26
    • 1970-01-01
    • 2020-12-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多