주어진 길이의 가능한 모든 비밀번호를 효율적으로 생성
무차별 암호 대입 크랙을 시도하는 경우 가능한 모든 조합을 효율적으로 생성하는 것이 중요합니다. . 이를 달성하기 위해 모든 비밀번호를 메모리에 동시에 저장하지 않고 다양한 비밀번호 길이를 허용하는 접근 방식을 살펴보겠습니다.
N-ary Cartesian Product
작업 손에는 집합의 n항 데카르트 곱을 생성하는 작업이 포함됩니다. n = 3인 'a'와 'b' 문자를 사용하여 3자리 비밀번호를 모두 생성하는 문제를 생각해 보세요.
반복 구성
원하는 비밀번호를 반복적으로 구성할 수 있습니다. 먼저 n-1 곱을 얻은 다음 초기 집합의 각 요소를 각 요소에 추가하여 곱합니다. product.
두 문자의 예
이 개념을 설명하기 위해 {a, b} 집합에서 모든 3자 비밀번호를 생성하는 프로세스를 고려해 보겠습니다.
Go에서의 구현
다음 Go 함수 반복적 구성 기법을 구현합니다:
func NAryProduct(input string, n int) []string { if n <= 0 { return nil } prod := make([]string, len(input)) for i, char := range input { prod[i] = string(char) } for i := 1; i < n; i++ { next := make([]string, 0, len(input)*len(prod)) for _, word := range prod { for _, char := range input { next = append(next, word + string(char)) } } prod = next } return prod }
성능 최적화
제시된 솔루션은 다양한 길이의 비밀번호를 생성해야 하는 경우 개선의 여지가 있습니다. 재계산을 방지하려면 임의의 (n-m)항 곱을 취하고 n항 곱을 재귀적으로 파생하도록 코드를 수정할 수 있습니다.
위 내용은 주어진 길이의 가능한 모든 비밀번호를 효율적으로 생성하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!