Java Преобразование из секунд в другие измерения не удается с некоторыми приращениями - PullRequest
0 голосов
/ 16 марта 2019

Я делаю проект, в котором я вычисляю время, необходимое для перебора определенного пароля в обработке (на основе Java).У меня это работает, за исключением случаев, когда число становится безумно высоким, оно выходит из строя и падает.Я подумал, что это связано с ограничением целых чисел, поэтому я перешел на него долго, и это все-таки произошло.Странно то, что это работает, если я сделаю число еще выше, как показано в этом 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";
}

Я пыталсянекоторые разные решения, но кажется очень странным, что он не работает с одним шагом, а следующий работает.

1 Ответ

0 голосов
/ 16 марта 2019

Ваша проблема, я полагаю, в вашей условной логике. Вы предполагаете, что если, например, 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, большие тоже должны быть.

...