首页 > 后端开发 > Golang > 正文

如何在 Go 中生成所有可能的 n 字符密码?

Linda Hamilton
发布: 2024-11-23 22:25:14
原创
335 人浏览过

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

在 Go 中生成所有可能的 n 字符密码

使用 Go 中给定集合中的字符生成指定长度的所有可能的密码,需要用到n元笛卡尔积的概念。本质上,这涉及构建一个集合与其自身 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', '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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板