0

不幸的是,我不擅长编写 java 代码,我需要你的帮助才能想出一个合适的解决方案。我被要求编写一个执行以下操作的应用程序;

如果某个数据被重新散列,应用程序必须确定是否存在任何冲突,给定次数。(默认为 1000 次,但要准备增加它)。应用程序必须将文本数据(数据,即密码)作为输入。应用程序必须接受一定数量(重新散列的次数)广告输入。应用程序必须输出多次出现的哈希值。!!!速度很重要。

根据要求,我找到了一段代码生成给定文本的哈希码,但我无法根据我被要求编写的应用程序来实现它。任何人都可以帮我这样做吗?

这是我找到的代码;

public String MD5(String md5) {
       try {
            java.security.MessageDigest md = java.security.MessageDigest.getInstance("MD5");
            byte[] array = md.digest(md5.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) {
        }
        return null;
    }   

这是我编写的代码,但似乎不起作用。显然,我做错了什么。有没有人可以告诉我代码的错误部分?很感谢任何形式的帮助。

private void jButtonrehashingMousePressed(MouseEvent evt) {

    String input = jTextAreaRehashing.getText();
    List<String> hashes = new ArrayList<String>();
    hashes.add(MD5(input));

    for (int i = 0; i <= (int) jComboBoxNumberOfHash.getSelectedItem(); i++)
    {
        input = hashes.get(i);
        hashes.add(MD5(input));
    }

    for (int j = 0; j <= hashes.size(); j++)
    {
        for (int k = j +1; k < hashes.size(); k++)
        {
            if (hashes.get(j).equals(hashes.get(k)))
            {
                jTextAreaRehashing.setText(jTextAreaRehashing.getText() + 
                        "Hash occured more than once: " + hashes.get(j) + "\n\r");
            }

        }
    }

}
4

1 回答 1

0

您的程序没有产生任何输出,因为它没有找到任何重复项,因为没有任何重复项。我认为您的代码正在运行。

MD5 冲突(重复哈希)的可能性非常低,因此 1,000 次重新哈希几乎不会返回任何内容。 http://en.wikipedia.org/wiki/MD5

但是,为了进一步了解您的问题,假设我们正在接受 10^20 或 2^64 次重新哈希,那么我们可能会开始看到一些冲突。

MD5 的摘要大小为 128 位,换句话说,有 2^128 个可能的不同 MD5 哈希值需要处理。

(我不知道这个集合需要多大,在我的几次试验中我没有找到任何东西。)

现在我们正在使用如此庞大的数据集,这就是效率(速度)变得重要的地方。我可以建议 HashSet 而不是 ArrayLists。还可以考虑使用 aHashSet.contains(Object a) 来测试,而不是使用双 for 循环。

Java 集合插入:Set 与 List

检查 List<String> 是否包含唯一字符串的最快方法

我还会检查算法中更高的重复项

private void jButtonrehashingMousePressed(MouseEvent evt) {

String input = jTextAreaRehashing.getText();
List<String> hashes = new ArrayList<String>();
hashes.add(MD5(input));

for (int i = 0; i <= (int) jComboBoxNumberOfHash.getSelectedItem(); i++)
{
    input = hashes.get(i);
    output = MD5(input)
    if(hashes.contains(output)){
      jTextAreaRehashing.setText(jTextAreaRehashing.getText() + 
                    "Hash occured more than once: " + output + "\n\r");
    }
    hashes.add(output);
}

}

祝你好运。

于 2013-08-17T02:29:05.523 回答