>백엔드 개발 >Golang >Go에서 가능한 모든 n-문자 비밀번호를 생성하는 방법은 무엇입니까?

Go에서 가능한 모든 n-문자 비밀번호를 생성하는 방법은 무엇입니까?

Linda Hamilton
Linda Hamilton원래의
2024-11-23 22:25:14419검색

How to Generate All Possible n-Character Passwords in Go?

Go에서 가능한 모든 n-문자 비밀번호 생성

Go에서 주어진 세트의 문자를 사용하여 지정된 길이의 가능한 모든 비밀번호를 생성하려면 , n-ary Cartesian product의 개념을 채택해야 합니다. 기본적으로 여기에는 n번 포함된 집합의 데카르트 곱을 구성하는 작업이 포함됩니다.

접근 방식은 반복적입니다. n-1 데카르트 곱이 먼저 구성됩니다. 그런 다음 각 제품과 초기 세트의 각 요소에 대해 해당 요소가 제품에 추가됩니다. 예를 들어 문자 'a'와 'b'를 사용하여 모든 3자리 비밀번호를 생성한다고 가정해 보겠습니다.

  • {'a', 'b'}의 1자리 데카르트 곱은 { 'a', 'b'}.
  • 2자리 데카르트 곱은 {('a', 'a'), ('a', 'b'), ('b', 'a'), ('b', 'b')}.
  • 3자리 데카르트 곱은 {('a', 'a', 'a'), ( 'a', 'a', 'b'), ('a', 'b', 'a'), ('a', 'b', 'b'), ('b', 'a', '에이'), ('b', 'a', 'b'), ('b', 'b', 'a'), ('b', 'b', 'b')}.

다음 Go 함수 NAryProduct는 이 반복 구성을 구현합니다.

import (
    "fmt"
    "strings"
)

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
}

예 사용법:

fmt.Println(NAryProduct("abc", 3)) // [aaa aab aac aba abb abc aca acb acc baa bab bac bba bbb bbc bca bcb bcc]

제공된 솔루션은 이전에 계산된 세트의 재계산을 방지하여 더욱 최적화될 수 있습니다.

위 내용은 Go에서 가능한 모든 n-문자 비밀번호를 생성하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.