processing - 从秒到其他度量的 Java 转换在某些增量处失败
问题描述
我正在做一个项目,我计算在处理(基于Java)中暴力破解某个密码所需的时间。我让它工作,除非数字变得非常高,它会出错并下降。我认为这是由于整数的限制,所以我改为 long,它仍然发生。奇怪的是,如果我将数字设置得更高,它会起作用,如下图所示: 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,则较大的数量也必须为 0。
推荐阅读
- csv - 如何使用 CSVProvider 加载具有不同结构的 csv?
- websocket - HttpListenerContext.AcceptWebSocketAsync 错误 1229
- azure - Terraform 从现有库存中增加资源
- git - Git Revert 命令拒绝恢复合并
- python - 通过阅读 Python 中的 Oracle DDL 语句为 Redshift 创建 Create Table 语句
- jquery - 单击一个元素,清空这个和另一个
- reactjs - 代码镜像在我的 React 应用程序中不起作用
- java - 在 Java Swing 中,当我跳出组合框时,如何让作为可编辑 JComboBox 的 Table CellEditor 保持其值?
- fortran - 使用 SGETR(F,I) 的 Fortran 逆矩阵计算仅适用于单精度
- ios - Swift:将开始和结束日期格式化为单个字符串