首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >加速蛮力算法

加速蛮力算法
EN

Code Review用户
提问于 2014-02-23 14:08:47
回答 1查看 3K关注 0票数 10

代码已不再相关,但我想知道如何使它更快。它只使用了我10%的CPU。任何关于最佳实践、更好的算法或如何使现有算法更快的建议都是受欢迎的。这纯粹是为了个人学习。

代码语言:javascript
运行
复制
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();
}
 }
EN

回答 1

Code Review用户

回答已采纳

发布于 2014-02-23 14:17:28

你们的大量工作只是普通的工作,必须做.(强暴的乐趣)。

MessageDigest

另一方面,这项工作是不必要的:

代码语言:javascript
运行
复制
byte[] pub2 = MessageDigest.getInstance("SHA-256").digest(pub);

这应改为:

代码语言:javascript
运行
复制
MessageDigest digest = MessageDigest.getInstance("SHA-256");

for (..... ) {

    digest.reset();
    byte pub2 = digest.digest(pub);

在每个循环中访问安全API是浪费大量时间,MessageDigest类被设计成可重用。

Parallelism...

你做的很多工作都涉及到获取和管理URL的.这是一项缓慢的工作,可以与生成密钥散列的艰苦工作并行完成。

我推荐一个线程来构建哈希流(存储了相关的输入),并将它们输入到队列大小有限的BlockingQueue中.然后,让控制线程从队列中读取这些内容,并将它们“分组”到多个其他线程,这些线程根据服务器创建并检查URL。

并行可以给你数量级的性能改进.(但会大量加载服务器.)

票数 11
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/42591

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档