不幸的是,我不擅长编写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");
}
}
}
}
答案 0 :(得分:0)
您的程序没有产生任何输出,因为它没有找到任何重复项,因为没有任何重复项。 我认为您的代码正在运行。
MD5冲突的可能性(重复的哈希值)非常低,因此1000次重访几乎不会返回任何内容。 http://en.wikipedia.org/wiki/MD5
然而,为了进一步阅读你的问题,让我们假设我们正在接受10 ^ 20或2 ^ 64次重访,然后我们可能会开始看到一些冲突。
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);
}
}
祝你好运。