gpt4 book ai didi

java - 性能暴力哈希 C++ Java

转载 作者:行者123 更新时间:2023-11-28 06:30:32 24 4
gpt4 key购买 nike

<分区>

我在 C++ 和 Java 中为 md5 实现了一个暴力破解器,并且对为什么它们的效率如此不同存在疑问。
数据和复杂性图(E^密码长度)与时间的关系在这里:http://i.imgur.com/hckCe8f.png
密码是简单的“b”重复以填充长度

在 C++ 中,我使用了 md5 的这个实现:zedwood.com/article/cpp-md5-function
在 Java 中,我使用了这个站点上的第二个实现:http://www.asjava.com/core-java/java-md5-example/

在递归 C++ 实现中,我的循环代码是在单独的类中完成的:

class bruteChar {
string charset;
char last_char;
string str;
string double_start;
char reverse_charset[256];
private:
string next(string s)
{
size_t length = s.size()-1;
if(length == 0)
{
if( s[0]==last_char)
return double_start;
return string(1, charset[reverse_charset[s[length]]+1]);
}
if(s[length] == last_char)
return next(s.substr(0,length))+charset[0];
else
return str.substr(0,length)+string(1, charset[reverse_charset[s[length]]+1]);
};

public:
void start (string chars)
{
charset = chars;
str=charset[0];
last_char=charset[charset.size()-1];
double_start=charset[0];
double_start+=charset[0];

for(size_t i = 0; i < charset.size(); ++i)
reverse_charset[charset[i]]=i;
reverse_charset[charset[charset.size()]]=0;
}

string next()
{
str=next(str);
return str;
}
};

在 Java 中我使用了自定义类

public class picochar {
public static char[] charset = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ".toCharArray();
int num;
int mod;

picochar(int init, int mod)
{
num = init%mod;
}

picochar(char init, int mod)
{
for(int i = 0; i < mod; i++)
{
if(charset[i] == init)
num = i;
}
}

public char get()
{
return charset[num];
}

public boolean equals(char ch)
{
return (get() == ch);
}

public void increment()
{
num++;
}
}

和下面的方法

public static String next(String s) {
int length = s.length();
picochar pc = new picochar(s.charAt(length - 1),mod);
if(pc.equals(picochar.charset[mod-1]))
return length > 1 ? next(s.substring(0, length - 1)) + 'a' : "aa";
pc.increment();
return s.substring(0, length - 1) + pc.get();
}

为什么 Java 在计算哈希值方面比 C++ 更高效?
我只是简单地为 Java 使用了一个高效的 MD5 实现,而为 C++ 使用了一个糟糕的 MD5 实现吗?
我认为 C++ 会比 Java 快得多,因为 Java 必须通过 JVM 运行所有内容,而 C 本身就可以完成。

但是,Java 远远胜过 C++ 解决方案。如果这仅仅是因为我的 C++ 程序编码不当,我该如何解决?

编辑以删除不同的 C++ 程序,现在两个解决方案都递归循环。

我计算了在没有散列的情况下循环需要多长时间,这里 Java 的速度是 C 的两倍,@Dunes 对此进行了解释。当重新编码为不递归使用 substr() 而是改变原始字符串时,C 的速度大约是 Java 的两倍。

我对哈希“hello”1<<25 次需要多长时间进行了一些测试,发现了一些奇怪的东西——Java 似乎“预热”得更快,虽然一开始速度较慢但很快就会 catch C 实现。
在散列几秒钟后,C++ 会获得类似的性能增益,但增益远不及 Java。

那么为什么 Java 预热效果更好呢?

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com