首页 > 解决方案 > 从秒到其他度量的 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";
}

我尝试了一些不同的解决方案,但似乎很奇怪,它不适用于一个增量,但下一个有效。

标签: processinglong-integerbrute-force

解决方案


我相信你的问题在于你的条件逻辑。例如,您假设如果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。


推荐阅读