Golang如何生成指定字母和长度的单词列表?

Golang如何生成指定字母和长度的单词列表? 我想用特定的字母和数字创建指定长度的单词列表。

例如特定字符 = abcd123,现在设置长度 = 5。

所以它应该输出:- aaaaa aaaab aaaac aaaad aaaa1 …依此类推…直到覆盖所有组合。请帮我编写代码。

func main() {
    fmt.Println("hello world")
}
20 回复

更多关于Golang如何生成指定字母和长度的单词列表?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


为什么你认为哈希值不正确?你在用什么进行对比?

但我认为它应该运行得很慢,不知道为什么它会这样停止。有什么解决办法吗?

但这只是不同的表示形式。如果以十六进制格式打印字节,你会得到想要的结果:

fmt.Printf("%s %X\n", join(v), hash)

但是它以括号形式出现,如 [a a a a a],而我想要它显示为 aaaaa

当然——可以使用其他包,或者手动实现算法,避免为结果分配内存。

// 示例代码
func example() {
    // 代码内容保持不变
}

谢谢……现在可以正常工作了……所以是我对 fmt.Printffmt.Println 的理解有误吗?

我想知道您是从哪里学到这么多关于 Golang 的知识的,如果可能的话我也想学习。请告诉我。

不。如果可以的话,忘记C、C++和所有那些东西吧 😊

关键几乎总是在算法而非实现。一定存在一些高效算法,但你可以从这里的一个简单算法开始:

重复组合

天啊,我现在真是走投无路了。看来我得从头开始学起了。还有件事想请教——为了更轻松地掌握Go语言,我应该先学C还是C++呢?毕竟昨天我才刚接触到%x、%c、%s、%d这些占位符。

感谢各位的支持。

pradhan5: 在Python中这很容易…但在Golang中却很困难。

其实并非如此。你之前已经在这里询问过关于sha256的问题:如何生成数字集合并用Golang生成sha256

pradhan5:

抱歉再次提问,但是当我将 abcd123 改为 abcdef0123456789 并将长度 5 改为 64 时,这段代码停止了。不知道发生了什么。 它只显示了一行就停止了?为什么?

这很简单——组合的数量非常庞大。我说的非常庞大是指真正巨大的数字。

func main() {
    fmt.Println("hello world")
}

例如:

package main

import (
	"fmt"
	"strings"

	"github.com/klaidliadon/next"
)

func main() {
	temp := strings.Split("abcd123", "")
	arr := make([]interface{}, len(temp))
	for i, v := range temp {
		arr[i] = v
	}
	for v := range next.Combination(arr, 5, true) {
		fmt.Println(v)
	}
}

https://play.golang.org/p/ky4WFb0Aq68

在我看来,Go语言确实是一门非常简洁的编程语言(由于我有C++经验可以进行对比:D),它拥有出色的文档资源、丰富的技术文章以及论坛里热情友好的社区氛围。

每位开发者最需要掌握的核心能力,就是学会如何提出精准的问题。掌握了这项技能后,你只需专注于学习不同语言的特性即可。而实现这一目标的最佳途径,就是通过完成有趣的实际项目来驱动学习。因为如果缺乏完成任务的动力,学习过程将会变得异常艰难。

func main() {
    fmt.Println("hello world")
}

GreyShatter:

temp := strings.Split("abcd123", "")
arr := make(interface{}, len(temp))
for i, v := range temp {
    arr[i] = v
}
for v := range next.Combination(arr, 5, true) {
    hash := sha256.Sum256(byte(join(v)))
    fmt.Printf("%s %X\n", join(v), hash)
}

抱歉再次提问,但是当我把"abcd123"改成"abcdef0123456789"并且把长度5改成64时,这段代码就停止了。不知道发生了什么问题。 它只显示了一行就停止了?为什么?

我不喜欢这个包,因为它需要在接口类型之间进行转换,但我想给你一个思路而不是完整的代码。当然,你可以像这样将结果拼接成字符串:

package main

import (
	"fmt"
	"strings"

	"github.com/klaidliadon/next"
)

func join(arr []interface{}) string {
	buf := ""
	for _, v := range arr {
		buf += v.(string)
	}
	return buf
}

func main() {
	temp := strings.Split("abcd123", "")
	arr := make([]interface{}, len(temp))
	for i, v := range temp {
		arr[i] = v
	}
	for v := range next.Combination(arr, 5, true) {
		fmt.Println(join(v))
	}
}

我再次检查了但还是不行。

package main

import (
    "fmt"
    "strings"
    "crypto/sha256"
    "github.com/next-master"
    "strconv"
)

func join(arr []interface{}) string {
    buf := ""
    for _, v := range arr {
        buf += v.(string)
    }
    return buf
}

func main() {
    temp := strings.Split("abcd123", "")
    arr := make([]interface{}, len(temp))
    for i, v := range temp {
        arr[i] = v
    }
    for v := range next.Combination(arr, 5, true) {
        hash := sha256.Sum256([]byte(strconv.Itoa(join(v))))
        fmt.Println("%s %X\n",join(v), hash)
    }
}

还是出现同样的错误…go:26:52: 无法将 join(v) (类型 string) 作为类型 int 在 strconv.Itoa 的参数中使用

是的,因为这完全没有意义。好的,让我们把所有部分整合起来:

package main

import (
	"crypto/sha256"
	"fmt"
	"strings"

	"github.com/klaidliadon/next"
)

func join(arr []interface{}) string {
	buf := ""
	for _, v := range arr {
		buf += v.(string)
	}
	return buf
}

func main() {
	temp := strings.Split("abcd123", "")
	arr := make([]interface{}, len(temp))
	for i, v := range temp {
		arr[i] = v
	}

	for v := range next.Combination(arr, 5, true) {
		hash := sha256.Sum256([]byte(join(v)))
		fmt.Printf("%s %X\n", join(v), hash)
	}
}

https://play.golang.org/p/-iAmaJkplhN

33333

根据示例:
对于33333,它应该返回 216E683FF0D2D25165B8BB7BA608C9A628EF299924CA49AB981EC7D2FECD6DAD

但它返回的是 [33 110 104 63 240 210 210 81 101 184 187 123 166 8 201 166 40 239 41 153 36 202 73 171 152 30 199 210 254 205 109 173]

SHA256验证链接:转换为SHA256

我想创建一个单词列表及其对应的哈希256值
例如 aaaaa ED968E840D10D2D313A870BC131A4E2C311D7AD09BDF32B3418147221F51A6E2

在Python中这很容易……但在Golang中却很困难。

你好GreyShatter,我从GitHub上找到了其他代码,但有个问题…它的sha256不匹配…请查看这段代码并帮我解决。

package main
import (
"fmt"
"math/big"
"crypto/sha256"
)

func main() {
// 打印表头
fmt.Printf("%64s %64s\n", "Raw-sha256", "hash-256",)

// 使用小数字初始化大数
count, one := big.NewInt(0), big.NewInt(1)

// 创建切片用于将计数填充到32字节
padded := make([]byte, 32)

// 无限循环,因为我们永远无法达到终点
for {
	// 递增计数器
	count.Add(count, one)
    
	
	// 将计数值的字节复制到填充切片
	copy(padded[32-len(count.Bytes()):], count.Bytes())
    
	
	
	sha256 := sha256.Sum256([]byte(padded))     

	
	
	// 打印密钥
	fmt.Printf("%x %x\n", padded, sha256)
}
}

以下是使用Go语言生成指定字母和长度单词列表的代码。该代码通过递归方式生成所有可能的组合,并输出到标准输出。

package main

import (
	"fmt"
)

func generateWords(chars string, length int, current string, results *[]string) {
	if len(current) == length {
		*results = append(*results, current)
		return
	}

	for i := 0; i < len(chars); i++ {
		generateWords(chars, length, current+string(chars[i]), results)
	}
}

func main() {
	chars := "abcd123"
	length := 5
	var results []string

	generateWords(chars, length, "", &results)

	for _, word := range results {
		fmt.Println(word)
	}
}

代码说明:

  1. generateWords 函数递归生成所有组合:
    • 当当前字符串长度达到指定长度时,将其加入结果切片
    • 否则遍历每个字符,递归调用自身生成更长的组合
  2. main 函数:
    • 定义字符集和单词长度
    • 调用生成函数并打印所有结果

对于字符集 “abcd123” 和长度 5,将生成 7^5 = 16807 个组合。输出将按字典序排列,从 “aaaaa” 开始,到 “33333” 结束。

注意: 组合数量随字符集大小和长度指数增长,请谨慎选择参数以避免内存溢出。

回到顶部