Senior
package main import ( "crypto/md5" "fmt" ) var alphabet = []rune{'a', 'b', 'c', 'd', '1', '2', '3'} func AtjaunotParoli(h []byte) string { return "" } func hashParole(in string) []byte { h := md5.Sum([]byte(in)) return h[:] } func main() { tests := []string{"a", "12", "abc333d"} ok := true for _, exp := range tests { h := hashParole(exp) act := AtjaunotParoli(h) if act != exp { fmt.Printf("Kļūda: gaidīts %q, saņemts %q\n", exp, act) ok = false } } if ok { fmt.Println("Visi testi veiksmīgi izpildījās") } } Lai pareizi palaistu kodu: ievades punkts -- funkcija main main paketē Uzdevums: Implementēt funkciju AtjaunotParoli, kas atjauno oriģinālo paroli, pamatojoties uz MD5 hash, kas sastāv no dotā alfabēta rakstzīmēm.
sobes.tech AI
Atbilde no AI
Функция RecoverPassword должна перебрать все возможные комбинации символов из заданного алфавита и сравнить их MD5-хэш с заданным. Поскольку алфавит небольшой, а длина пароля не ограничена явно, разумно ограничить максимальную длину перебора (например, до 7 символов, как в тестах).
Пример реализации перебора с рекурсией:
func RecoverPassword(h []byte) string {
var res string
var found bool
var dfs func(current []rune)
dfs = func(current []rune) {
if found {
return
}
if len(current) > 0 {
if string(hashPassword(string(current))) == string(h) {
res = string(current)
found = true
return
}
}
if len(current) == 7 { // ограничение длины
return
}
for _, c := range alphabet {
dfs(append(current, c))
}
}
dfs([]rune{})
return res
}
Такой перебор гарантирует нахождение пароля, если он состоит из символов alphabet и длина не превышает 7. Для больших паролей или алфавитов потребуется более эффективный подход, но для задачи и тестов этого достаточно.