2013-08-17 115 views
0

不幸的是,我不擅长编写Java代码,我需要你的帮助才能想出一个合适的解决方案。我被要求写一个应用程序来做下面的事情;在Java中重新生成生成的MD5代码

如果某个数据被重新映射,应用程序必须查找是否有任何冲突,给定次数。 (默认是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"); 
      } 

     } 
    } 

} 
+3

我们不是一个写代码的工厂。尝试一下。如果一个特定的部分不起作用,并且您提供尽可能多的细节以了解原因,我们将帮助您 –

+0

亲爱的Sotirios。我完全同意你的意见,并请按上述方式查找我更新的问题。感谢您的任何帮助。 –

+0

我意识到我没有从'String input = jTextAreaRehashing.getText();'获取文本作为输入。并通过替换'String input = jTextFieldHasCodeInput.getText();'来修复它但结果是一样的。应用程序无所事事。 –

回答

0

您的程序没有生成任何输出,因为它没有找到任何重复项,因为没有任何重复项。 我认为你的代码正在工作。

MD5碰撞(哈希被重复)的几率非常低,因此1,000次rehashes几乎不会返回任何东西。 http://en.wikipedia.org/wiki/MD5

但是,如果要进一步阅读您的问题,我们假设我们正在接受10^20或2^64的rehashes,那么我们可能会开始看到一些冲突。

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

(我不知道集将有多大需要是,在我的几个试验的我没有找到任何。)

现在我们正在使用这种大型数据集,这是那里的效率(速度)变得重要。 我可以建议HashSet而不是ArrayLists。 也考虑使用aHashSet.contains(Object a)来测试而不是double for循环。

Java collection insertion: Set vs. List

Fastest way to check if a List<String> contains a unique 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); 
} 

}

好运。