Содержание
Адвент кода 2016 День 5
Часть 1
- Движение назад помогло
- Игра в ожидание… снова
Движение назад помогло
К настоящему времени я уже достаточно хорошо знаком с хэшированием MD5:
- День 17: Два шага вперед
- День 14: Одноразовый блокнот
- А теперь день 5, который, как я полагаю, является первой головоломкой на тему
MD5
в этом году — хотя я могу ошибаться.
Игра в ожидание… снова
- Сгенерировать хэш
- Проверьте совпадение
00000
с первыми пятью символами в хэше - Повторять до тех пор, пока не будет найдено восемь совпадений
Мой алгоритм на JavaScript:
let index = 0, password = "", doorID = 'abc'
while (password.length < 8) {
let hash = MD5(doorID + index).toString()
if (hash.slice(0,5) == '00000') {
password += hash[5]
}
index++
}
return password
Это может занять некоторое время… особенно если совпадение состоит из пяти 0
подряд!
…
Это заняло не так много времени, как в День 14 — где мне пришлось генерировать 2017 хэшей каждую итерацию!
Но все равно на выполнение ушло несколько минут.
К счастью, он сгенерировал правильный ответ для моего идентификатора двери!
Часть 2
Крутой поворот и более длительное ожидание
- Я обновил свой алгоритм, чтобы учесть массив, позицию и значение.
Но изначально я не учел эту часть инструкции:
Использовать только первый результат для каждой позиции
- Я не был уверен, что это значит.
- Пока я не запустил свой алгоритм на входном примере.
- И я получил ответ, отличный от ожидаемого.
- Потому что я изменил некоторые из уже установленных значений.
После обновления моего кода, чтобы учесть это:
password[hash[5]] = password[hash[5]] || hash[6]
Мой алгоритм сгенерировал правильный ответ для ID двери примера и ID моей двери!
Мой обновленный алгоритм на JavaScript:
let index = 0, doorID = 'abc'
let password = new Array(8).fill(null)
while (password.includes(null)) {
let hash = MD5(doorID + index).toString()
if (hash.slice(0,5) == '00000' && hash[5] < 8) {
password[hash[5]] = password[hash[5]] || hash[6]
}
index++
}
return password.join('')
Я сделал это!!!
- Я решил обе части!
- После короткого времени написания и долгого времени ожидания!
- И вместив один важный случай использования в моем алгоритме!