Java 从秒到其他度量的转换在某些增量时失败
Java Conversion from Seconds to other measurements fail at some increments
我正在做一个项目,计算在 Processing 中暴力破解某个密码所需的时间(基于 Java)。我有它的工作,除非当数字变得非常高时,它会出错并下降。我认为这是由于整数的限制,所以我改成了 long,但它仍然发生了。
奇怪的是,如果我把数字调得更高,它就会起作用,如这个 GIF 所示:
https://gyazo.com/7c50600acc5b0f03ff3634d49f85c9ef
这是计算它的代码:
int pwLength = password.length();
totalChars = upperChar + lowerChar + intChar + specialChar;
float combinations = pow(totalChars, pwLength);
String bruteForceFinal = "";
float keysPerSec = 15050850.21;
float bruteForceTime = combinations/keysPerSec;
if(bruteForceTime >= 1)
{
long seconds = floor((bruteForceTime) % 60);
long minutes = floor((bruteForceTime / (60)) % 60);
long hours = floor((bruteForceTime / (60 * 60)) % 24);
long days = floor((bruteForceTime / (60 * 60 * 24)) % 30);
long months = floor((bruteForceTime / (60 * 60 * 24 * 30)) % 12);
long years = floor((bruteForceTime / (60 * 60 * 24 * 30 * 12)));
if((years == 0) && (months != 0))
{
bruteForceFinal = (months + " Months " + days + " Days " + hours + " Hours " + minutes + " Minutes " + seconds + " Seconds ");
} else if((months == 0) && (days != 0))
{
bruteForceFinal = (days + " Days " + hours + " Hours " + minutes + " Minutes " + seconds + " Seconds ");
} else if((days == 0) && (hours != 0))
{
bruteForceFinal = (hours + " Hours " + minutes + " Minutes " + seconds + " Seconds ");
} else if((hours == 0) && (minutes != 0))
{
bruteForceFinal = (minutes + " Minutes " + seconds + " Seconds ");
} else if((minutes == 0) && (seconds != 0))
{
bruteForceFinal = (seconds + " Seconds ");
} else
{
bruteForceFinal = (years + " Years " + months + " Months " + days + " Days " + hours + " Hours " + minutes + " Minutes " + seconds + " Seconds ");
}
} else if((bruteForceTime < 1) && (bruteForceTime > 0.001))
{
bruteForceFinal = (round(bruteForceTime * 1000) + " Milliseconds");
}
else
{
bruteForceFinal = "Less than a millisecond";
}
我尝试了一些不同的解决方案,但似乎很奇怪,它不适用于一个增量,但下一个增量有效。
我相信你的问题出在你的条件逻辑上。例如,您假设如果 month == 0,那么您所谈论的数量少于一个月。但总时间可能长达数年,但月份可能恰好显示为 0。我认为这就是为什么您会看到明显的随机性。
我尽我所能重现了你的结果,并看到了不良行为。然后我取出所有条件来始终打印所有数量,我得到:
0 Years 0 Months 0 Days 0 Hours 4 Minutes 6 Seconds
0 Years 0 Months 0 Days 5 Hours 36 Minutes 38 Seconds
4 Years 4 Months 11 Days 22 Hours 34 Minutes 8 Seconds
358 Years 0 Months 19 Days 2 Hours 24 Minutes 28 Seconds
29360 Years 4 Months 7 Days 8 Hours 56 Minutes 44 Seconds
2407548 Years 10 Months 18 Days 16 Hours 28 Minutes 28 Seconds
197419008 Years 0 Months 0 Days 0 Hours 24 Minutes 12 Seconds
16188359680 Years 0 Months 2 Days 0 Hours 16 Minutes 20 Seconds
我认为结果中的所有零数量导致您的代码使用了错误的打印调用。我不能确定,因为我没有你的确切字符数。
简而言之,您需要检查所有较大的数量是否为零,而不是假设如果某些数量为 0,则较大的数量也必须为零。
我正在做一个项目,计算在 Processing 中暴力破解某个密码所需的时间(基于 Java)。我有它的工作,除非当数字变得非常高时,它会出错并下降。我认为这是由于整数的限制,所以我改成了 long,但它仍然发生了。 奇怪的是,如果我把数字调得更高,它就会起作用,如这个 GIF 所示: https://gyazo.com/7c50600acc5b0f03ff3634d49f85c9ef
这是计算它的代码:
int pwLength = password.length();
totalChars = upperChar + lowerChar + intChar + specialChar;
float combinations = pow(totalChars, pwLength);
String bruteForceFinal = "";
float keysPerSec = 15050850.21;
float bruteForceTime = combinations/keysPerSec;
if(bruteForceTime >= 1)
{
long seconds = floor((bruteForceTime) % 60);
long minutes = floor((bruteForceTime / (60)) % 60);
long hours = floor((bruteForceTime / (60 * 60)) % 24);
long days = floor((bruteForceTime / (60 * 60 * 24)) % 30);
long months = floor((bruteForceTime / (60 * 60 * 24 * 30)) % 12);
long years = floor((bruteForceTime / (60 * 60 * 24 * 30 * 12)));
if((years == 0) && (months != 0))
{
bruteForceFinal = (months + " Months " + days + " Days " + hours + " Hours " + minutes + " Minutes " + seconds + " Seconds ");
} else if((months == 0) && (days != 0))
{
bruteForceFinal = (days + " Days " + hours + " Hours " + minutes + " Minutes " + seconds + " Seconds ");
} else if((days == 0) && (hours != 0))
{
bruteForceFinal = (hours + " Hours " + minutes + " Minutes " + seconds + " Seconds ");
} else if((hours == 0) && (minutes != 0))
{
bruteForceFinal = (minutes + " Minutes " + seconds + " Seconds ");
} else if((minutes == 0) && (seconds != 0))
{
bruteForceFinal = (seconds + " Seconds ");
} else
{
bruteForceFinal = (years + " Years " + months + " Months " + days + " Days " + hours + " Hours " + minutes + " Minutes " + seconds + " Seconds ");
}
} else if((bruteForceTime < 1) && (bruteForceTime > 0.001))
{
bruteForceFinal = (round(bruteForceTime * 1000) + " Milliseconds");
}
else
{
bruteForceFinal = "Less than a millisecond";
}
我尝试了一些不同的解决方案,但似乎很奇怪,它不适用于一个增量,但下一个增量有效。
我相信你的问题出在你的条件逻辑上。例如,您假设如果 month == 0,那么您所谈论的数量少于一个月。但总时间可能长达数年,但月份可能恰好显示为 0。我认为这就是为什么您会看到明显的随机性。
我尽我所能重现了你的结果,并看到了不良行为。然后我取出所有条件来始终打印所有数量,我得到:
0 Years 0 Months 0 Days 0 Hours 4 Minutes 6 Seconds
0 Years 0 Months 0 Days 5 Hours 36 Minutes 38 Seconds
4 Years 4 Months 11 Days 22 Hours 34 Minutes 8 Seconds
358 Years 0 Months 19 Days 2 Hours 24 Minutes 28 Seconds
29360 Years 4 Months 7 Days 8 Hours 56 Minutes 44 Seconds
2407548 Years 10 Months 18 Days 16 Hours 28 Minutes 28 Seconds
197419008 Years 0 Months 0 Days 0 Hours 24 Minutes 12 Seconds
16188359680 Years 0 Months 2 Days 0 Hours 16 Minutes 20 Seconds
我认为结果中的所有零数量导致您的代码使用了错误的打印调用。我不能确定,因为我没有你的确切字符数。
简而言之,您需要检查所有较大的数量是否为零,而不是假设如果某些数量为 0,则较大的数量也必须为零。