生成每个数字到22位小数

时间:2016-01-07 12:14:22

标签: java math cryptography

我想循环遍历从0.00000000000000000000000.9999999999999999999999的每个号码,然后对此号码执行操作。

但显然通常的for循环使用整数并且具有最大值。

在Java中使用Java的最佳方式是什么?您认为通过每种可能的组合需要花费的时间超过一天吗?

感谢任何帮助。谢谢。

编辑 - 添加一些上下文:

所以基本上我希望能够从0.0到>之间的数字的MD5哈希中去。纯文本编号为1.0(小数点后22位)。所以最初我有一个想法,就像一个彩虹表,只是将每个可能的数字映射到它的哈希,所以我可以只查找哈希并得到相应的数字,显然有点雄心勃勃,我已经意识到这一点我需要重新考虑一下 - 如果有人有任何想法,我愿意接受。

3 个答案:

答案 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所提到的,除非你在这里运行,否则这样的循环将无法完成

http://www.extremetech.com/extreme/219160-googles-quantum-computer-is-100-million-times-faster-than-a-conventional-system

接下来只在理论上,在java中你可以使用BigDecimal数字编写漂亮的可读代码,但它不会是最快的。另一方面,为了解决生命周期问题,机器语言最好编写最快的代码,这需要集群到许多处理器内核并并行运行。

你想破解一些密码吗?

相关问题