Golang如何生成指定字母和长度的单词列表?
Golang如何生成指定字母和长度的单词列表? 我想用特定的字母和数字创建指定长度的单词列表。
例如特定字符 = abcd123,现在设置长度 = 5。
所以它应该输出:- aaaaa aaaab aaaac aaaad aaaa1 …依此类推…直到覆盖所有组合。请帮我编写代码。
func main() {
fmt.Println("hello world")
}
为什么你认为哈希值不正确?你在用什么进行对比?
但我认为它应该运行得很慢,不知道为什么它会这样停止。有什么解决办法吗?
但这只是不同的表示形式。如果以十六进制格式打印字节,你会得到想要的结果:
fmt.Printf("%s %X\n", join(v), hash)
但是它以括号形式出现,如 [a a a a a],而我想要它显示为 aaaaa
当然——可以使用其他包,或者手动实现算法,避免为结果分配内存。
// 示例代码
func example() {
// 代码内容保持不变
}
谢谢……现在可以正常工作了……所以是我对 fmt.Printf 和 fmt.Println 的理解有误吗?
我想知道您是从哪里学到这么多关于 Golang 的知识的,如果可能的话我也想学习。请告诉我。
天啊,我现在真是走投无路了。看来我得从头开始学起了。还有件事想请教——为了更轻松地掌握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)
}
}
在我看来,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)
}
}
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)
}
}
代码说明:
generateWords函数递归生成所有组合:- 当当前字符串长度达到指定长度时,将其加入结果切片
- 否则遍历每个字符,递归调用自身生成更长的组合
main函数:- 定义字符集和单词长度
- 调用生成函数并打印所有结果
对于字符集 “abcd123” 和长度 5,将生成 7^5 = 16807 个组合。输出将按字典序排列,从 “aaaaa” 开始,到 “33333” 结束。
注意: 组合数量随字符集大小和长度指数增长,请谨慎选择参数以避免内存溢出。

