使用Advent of Code在Java中编写一些Java编程问题并遇到一个问题,它要求我找到最小的六位整数,并结合前导字符串iwrupvqb
,它产生了一个MD5哈希值五个零。
我使用Apache DigestUtils.md5Hex函数找到了这个部分的答案,我只是强行通过100000-999999并将其与iwrupvqb
结合起来,直到我得到一个以五个零开始的MD5。
答案是iwrupvqb346386
创建哈希:
0000045c5e2b3911eb937d9d8c574f09
现在它要我找到一个有六个前导零的一个。我一直在浏览md5算法如何工作的页面和页面,反转MD5等,但似乎无法找出方程格式中的问题,这将帮助我确定如何根据使用的字符计算MD5
我甚至让这个循环运行30分钟 - 一小时看看它是否有超过六位整数的任何命中(因为显然没有任何组合这个文本短语创建六个前导零)
我对十六进制一无所知,所以在这一点上我只是在黑暗中拍摄并试图猜测整夜的数字组合并不是我的事情。除了练习之外,我不一定需要解决这个问题,但我很想知道这里发生了什么。 (是的,我知道MD5已被泄露,我不会在生产中使用它)
答案 0 :(得分:2)
这个问题只能通过暴力破解来解决。这正是"工作证明"例如,在比特币工作。加快速度的唯一方法是优化计算中的每一步。由于这个原因,比特币矿工已经转向专业硬件。他们不做任何事情"特别"或者"聪明",他们只是非常非常快地计算哈希。
您只能优化代码并在其上投放更多/更好的硬件。计算节点集群在这里也可以很好地工作,这个问题有助于并行处理(同样,比特币挖掘池)。
如果你有一个多核CPU,一件容易的事就是每个CPU使用一个线程。应该线性加速(可能仍然不够快)。
答案 1 :(得分:0)
我也在使用代码的出现,但我正在使用PowerShell。我解决了第4天的益智2,基本上与我用来解决益智1的代码相同。唯一的变化是WHILE条件检查6个前导零。它确实需要花费更长的时间才能完成拼图1的解决。我只是在看到这篇文章后将其踢掉并上床睡觉。我醒来时得到了答案。我的代码发布在Github。 Advent of Code Day 4 Puzzle 2 solution with PowerShell