Closed. This question needs to be more focused。它当前不接受答案。                                                                                                                                                                                                                                                                                                                        想改善这个问题吗?更新问题,使其仅通过editing this post专注于一个问题。                                                4年前关闭。                                                                                                                    我在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 ++使用了较差的实现?我以为C ++会比Java快得多,因为Java必须通过JVM运行所有内容,而C则是本机运行。但是,Java远远超过了C ++解决方案。如果这仅仅是由于我的C ++程序编码不正确,我该如何解决?经过编辑以删除不同的C ++程序,现在这两个解决方案都递归循环。我做了一些计时,以了解不进行散列而进行循环要花多长时间,这里Java的速度是C的两倍,这由@Dunes解释。当重新编码为不递归使用substr()而不是改变原始字符串时,C的运行速度大约是Java的两倍。我对散列“ hello” 1 在经过几秒钟的哈希运算之后,C ++的性能会有类似的提高,但是这种提高远不及Java。那么,为什么Java预热更好? 最佳答案 看来C ++实现如此之慢的原因是因为您要按值传递字符串。也就是说,每次您使用字符串参数调用方法或返回字符串时,程序都必须对整个字符串进行全新复制。鉴于Java具有不可变的字符串,因此可以通过传递相同字符串的不同视图来避免这种情况。 String.substring不会复制后备char数组。取而代之的是,新的字符串对象只是跟踪与后备char数组有关的起始索引和长度。如果不正确地使用子字符串,可能会导致内存泄漏-一个字符视图将使原始的百万个字符支持数组保持活动状态(只要存在)。关于java - 性能蛮力散列C++ Java,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27666705/
10-12 21:23