Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 通过22位小数生成每个数字_Java_Math_Cryptography - Fatal编程技术网

Java 通过22位小数生成每个数字

Java 通过22位小数生成每个数字,java,math,cryptography,Java,Math,Cryptography,我想循环查看从0.0000000000000000到0.99999999999999999999的每个数字,然后对这个数字执行操作 但很明显,通常的for循环使用的是一个整数,并且有一个max值 在Java中实现这一点的最佳方法是什么?您是否认为完成每一个可能的组合都需要一天以上的时间 感谢您的帮助。多谢各位 编辑-添加一些上下文: 因此,基本上我希望能够从0.0->1.0(小数点后22位)之间的数字的MD5散列转换为纯文本数字。所以我最初的想法是创建一个彩虹表,将每个可能的数字映射到它的散列,

我想循环查看从
0.0000000000000000
0.99999999999999999999
的每个数字,然后对这个数字执行操作

但很明显,通常的for循环使用的是一个整数,并且有一个max值

在Java中实现这一点的最佳方法是什么?您是否认为完成每一个可能的组合都需要一天以上的时间

感谢您的帮助。多谢各位

编辑-添加一些上下文:


因此,基本上我希望能够从0.0->1.0(小数点后22位)之间的数字的MD5散列转换为纯文本数字。所以我最初的想法是创建一个彩虹表,将每个可能的数字映射到它的散列,这样我就可以查找散列并得到相应的数字,很明显,我意识到这有点雄心勃勃,所以我需要重新思考一下——如果有人有任何想法,我都愿意接受。

一个解决办法是将数字视为字符串。这样,您就可以应用字典排序,并循环遍历所有您想要的数字。但是,这意味着您必须处理10^22个字符串,其中每个字符串都将由前一个字符串生成。因此,我对这项工作的效率有点谨慎。无论如何,您可以参考维基百科关于词典排列的链接,并实现所描述的算法。

您可以使用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());
        }
    }
publicstaticvoidmain(字符串[]args)引发IOException{
BigDecimal end=新的BigDecimal(“0.9999999999999999”);
对于(BigDecimal bd=新的BigDecimal(“0.0000000000000000000000”);

bd.compareTo(end)您希望使用长数字,因为没有理由使用双精度(它们无法处理这样的范围).long是18-19位,这是不够的,但您可以使用嵌套循环乘以两个long,这可能会在java中提供最好的性能。您应该使用long和not long。正如Andy提到的,除非您在此处运行,否则这种循环在生命周期内不会完成

其次,在理论上,在java中,您可以使用BigDecimal数字来编写可读性好的代码,但它不会是最快的。另一方面,为了解决生存期问题,机器语言最好编写最快的代码,这需要群集到多个处理器核并并行运行


你想破解一些密码吗?

谁说
for
循环只对整数有效?虽然浮点精度在这里是一个问题,但没有理由不能使用
双精度
作为计数器。不幸的是,如果你在考虑浮点数,我认为这是不可能的,在合理的数量内是的,我的步长是在这个范围内有10^22个数字;如果你能每纳秒处理一个,你应该在300000年左右完成。虽然这是浮点精度的一个解决办法,但我不明白这是怎么回事比使用
double
s更有效。OP希望“对该号码执行操作”。这将如何工作?也许你可以详细说明一下?我认为这可能效率太低,因为它将产生与数字一样多的排列?我不认为Double可以处理OP想要的精度。对数字执行操作只需要对其进行简单的分析。无论如何,我提到它是一种解决方法。任何方法都需要要完成的时间太多了。使用
BigDecimal
似乎比使用
String
s更符合逻辑的精度修复方法。@Arc676我想得到一个数字的MD5散列并存储它,这样最终我可以做一个查找表,这样有人可以给我一个数字的散列,我就可以告诉他们这个数字了。但是从事情的声音来看,我知道了我已经选择了最糟糕的方法,所以我必须重新考虑一下。这可能需要比一天更长的时间。在我的计算机上,一个循环大约需要400ns。我们在这里进行10^22次迭代。这大约需要1.3亿年的时间。我希望你的计算机能保持完好这么长时间。我不知道提问者是否有超高的分布式基础设施o计算这些值。所以我只向他展示了如何循环数字。谢谢你,这是我想要的,但现在我意识到我尝试做的事情将花费永远的时间,所以我将不得不以另一种方式来处理。虽然我很感激,但它会派上用场。谢谢我很感激,这里还有一些上下文,所以我基本上希望能够继续om是介于0.0->1.0之间的数字的MD5散列(小数点后22位)对于纯文本数字。因此,最初我的想法是创建一个彩虹表,将每个可能的数字映射到它的散列,这样我就可以查找散列并得到相应的数字,显然这有点雄心勃勃,我已经意识到,所以我需要重新考虑一下——如果有人有任何想法,我都愿意接受。那么,你会知道的ve内存问题。最近在MD5反向工程方面做了一些工作,发现了一些漏洞,因此MD5被认为是不安全的。您可以检查这一点,但暴力强制不是办法。