我想循环遍历从0.0000000000000000000000
到0.9999999999999999999999
的每个号码,然后对此号码执行操作。
但显然通常的for循环使用整数并且具有最大值。
在Java中使用Java的最佳方式是什么?您认为通过每种可能的组合需要花费的时间超过一天吗?
感谢任何帮助。谢谢。
编辑 - 添加一些上下文:
所以基本上我希望能够从0.0到>之间的数字的MD5哈希中去。纯文本编号为1.0(小数点后22位)。所以最初我有一个想法,就像一个彩虹表,只是将每个可能的数字映射到它的哈希,所以我可以只查找哈希并得到相应的数字,显然有点雄心勃勃,我已经意识到这一点我需要重新考虑一下 - 如果有人有任何想法,我愿意接受。
答案 0 :(得分:1)
解决方法可能是将您的数字视为字符串。这样你就可以应用词典排序并循环遍历你想要的所有数字。但是,这意味着您将不得不处理10 ^ 22个字符串,其中每个字符串将由前一个字符串生成。因此,我对此的效率有点谨慎。无论如何,你总是可以参考词典排列的this维基百科链接并实现所描述的算法。
答案 1 :(得分:1)
您可以使用BigDecimal尝试它,如下面的代码:
public static void main(String[] args) throws IOException {
BigDecimal end=new BigDecimal("0.9999999999999999999999");
for(BigDecimal bd=new BigDecimal("0.0000000000000000000000");
bd.compareTo(end)<=0;
bd=bd.add(new BigDecimal("0.0000000000000000000001"))){
System.out.printf("%s\n",bd.toPlainString());
}
}
可能需要更长的时间,这取决于您的硬件 我希望它有所帮助。
答案 2 :(得分:1)
你想使用长数字,因为没有理由选择双打(他们无法处理这样的范围)。 long是18-19位数这是不够的,但你可以通过使用嵌套循环乘以两个long,这将在java中提供最佳性能。你应该使用long而不是Long。无论如何,正如Andy所提到的,除非你在这里运行,否则这样的循环将无法完成
接下来只在理论上,在java中你可以使用BigDecimal数字编写漂亮的可读代码,但它不会是最快的。另一方面,为了解决生命周期问题,机器语言最好编写最快的代码,这需要集群到许多处理器内核并并行运行。
你想破解一些密码吗?