首页 > 编程语言 >golang字典生成算法实现(全排列实现)

golang字典生成算法实现(全排列实现)

时间:2023-01-21 00:33:51浏览次数:53  
标签:false dicts 实现 BoolVar golang flag bool var 字典

package main

// @Title	main.go
// @Description	入口文件
// @Author	xiao
// @Update	none

import (
	"flag"
	"fmt"
	"log"
)

// 字典常量
const (
	lowerCaseChars = "abcdefghijklmnopqrstuvwxyz" // 小写字母
	upperCaseChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" // 大写字母
	nums           = "0123456789"                 // 数字
	//nums           = "01"                               // 数字
	halfWidthChars = "`~!@#$%^&*()_+=-{}[]:\";’|<>?,./"  // 半角标点
	fullWidthChars = "`~!#¥%^&*()_+=-{}[]:";'\|<>?,./,。" // 全角标点
	//fullWidthChars = "`~"
	blankspace = " " // 空格
)

var wordLen int = 1
var lower bool
var upper bool
var num bool
var hf bool
var fl bool
var blank bool

// 默认情况下字典范围哦
var dicts string = ""
var runeDicts []rune

// @title	init
// @descroption	 参数解析
// @auth	xiao 2023/01/13
// @update	none
// @param
// @return
func init() {
	flag.IntVar(&wordLen, "len", 1, "需要生成的单词长度")
	flag.BoolVar(&lower, "lower", false, "使用小写字母")
	flag.BoolVar(&upper, "upper", false, "使用大写字母")
	flag.BoolVar(&num, "num", false, "使用0-9数字")
	flag.BoolVar(&hf, "hf", false, "使用半角标点集合")
	flag.BoolVar(&fl, "fl", false, "使用全角表单集合")
	flag.BoolVar(&blank, "bl", false, "使用空格")
	flag.Parse()
}

func buildDicts() {
	if lower {
		dicts = dicts + lowerCaseChars
	}

	if upper {
		dicts = dicts + upperCaseChars
	}

	if num {
		dicts = dicts + nums
	}

	if hf {
		dicts = dicts + halfWidthChars
	}

	if fl {
		dicts = dicts + fullWidthChars
	}

	if blank {
		dicts = dicts + blankspace
	}

	if wordLen <= 0 {
		log.Fatal("参数设置错误!")
	}

	if len(dicts) == 0 {
		log.Fatal("所选字典为空!")
	}

	runeDicts = []rune(dicts)
}

// wheel
type wheel struct {
	charIndex int
	prewheel  *wheel
	lastwheel bool
}

// @title	gen
// @descroption	 遍历生成本齿轮中的字符序列
// @auth	xiao 2023/01/14
// @update	none
// @param word *string 字典结果
// @return 字典结果
func (cg *wheel) gen(word *string) (*string, bool) {
	if cg.charIndex == len(runeDicts) {
		cg.charIndex = 0
		cg.notifyPreWheel()
		return word, true
	}
	if cg.charIndex < len(runeDicts) {
		*word = string(runeDicts[cg.charIndex]) + *word
		if cg.lastwheel {
			cg.charIndex++
		}
	}
	return word, false
}

// @title	notifyPreWheel
// @descroption	 通知齿轮中前一个齿轮滑动到下一个字符序列
// @auth	xiao 2023/01/14
// @update	none
// @param
// @return void
func (w *wheel) notifyPreWheel() {
	if w.prewheel != nil {
		w.prewheel.charIndex++
	}
}

var wheels = make([]*wheel, 0)

func buildDictWheels() {
	for i := 0; i < wordLen; i++ {
		if i == 0 {
			wheels = append(wheels, &wheel{prewheel: nil, charIndex: 0, lastwheel: false})
		} else {
			w := wheels[i-1]
			wheels = append(wheels, &wheel{prewheel: w, charIndex: 0, lastwheel: false})
		}
	}
	wheels[len(wheels)-1].lastwheel = true
}

// @title	main
// @descroption	 main
// @auth	xiao 2023/01/13
// @update	none
// @param
// @return	0 执行成功 1 执行异常
func main() {
	buildDicts()
	log.Println("当前所选字符集合:", dicts)

	buildDictWheels()

	for {
		stopflag := true
		skipWord := false
		word := ""
		for i := len(wheels) - 1; i >= 0; i-- {
			_, stop := wheels[i].gen(&word)
			if stop {
				skipWord = true
			}
			stopflag = stop && stopflag
		}
		if stopflag {
			break
		}
		if !skipWord {
			fmt.Println(word)
		}
	}
}

没什么好说的,直接贴代码吧,见过水表么?水表里面就是N多个齿轮组合在一起,最后一个齿轮转一圈带动前面一个齿轮转一下,当所有齿轮转到最大的时候表示所有字符组合遍历完一遍。代码实现每一位密码相当于一个水表齿轮。

#./dictgen -len 2 -num -lower > 1.txt
#cat 1.txt
aa
ab
ac
ad
ae
af
ag
ah
ai
aj
ak
al
am
an
ao
ap
aq
ar
as
at
au
av
aw
ax
ay
az
a0
a1
a2
a3
a4
a5
a6
...

为什么不用递归来生成密码?8位以上大小写字符数字密码递归估计没什么机器能搞下来吧!但这土鳖办法却能!

标签:false,dicts,实现,BoolVar,golang,flag,bool,var,字典
From: https://www.cnblogs.com/xmy20051643/p/17063429.html

相关文章

  • Docker安装FileBrowser实现网页版文件管理器
    FileBrowser是一款基于现代浏览器技术的WEB版多用户文件管理器,它可以与我们的Aria2、qBittorrent等软件相结合,构建一个完整的离线下载与文件管理私有云。简单网盘,可以管理......
  • C语言实现 vector( 动态数组) 改进版(转)
    之所以再写一封邮件缘起于我写的《C语言实现vector(动态数组)》这篇文章http://blog.csdn.net/dengxu11/article/details/5915857。原来这个是在Linux下写的,多谢troubl......
  • C语言实现扫雷游戏
    前言如何利用代码实现一个扫雷游戏呢?在我们玩过的扫雷游戏里,打开游戏后看到的是一个nxn的棋盘,我们需要点击棋盘的某一位置,在最短的时间内根据点击格子出现的数字找出所有非......
  • docker部署nginx+宿主机部署keepalive实现高可用(离线方式安装)
    docker部署nginx+宿主机部署keepalive实现高可用(离线方式安装)一、准备两台虚拟机,离线安装docker1.下载docker的安装包我这里是19.03.9版本链接:https://pan.baidu.com......
  • C语言实现三子棋游戏
    什么是三子棋游戏?三子棋是一种民间传统游戏,又叫九宫棋、圈圈叉叉棋、一条龙、井字棋等。游戏分为双方对战,双方依次在9宫格棋盘上摆放棋子,棋盘被占满前率先将自己的三个棋子......
  • 实现中文UTF8的过滤器
    1.过滤器代码:packagecom.yin;importjavax.servlet.*;importjava.io.IOException;publicclassfilterimplementsFilter{publicvoidinit(FilterConfig......
  • 实现一个整型有序数组的二分查找(函数)
    解法:#include<stdio.h>intbinary_search(intarr[],intk,intsz){//intsz=sizeof(arr)/sizeof(arr[0]);不能在这intleft=0;intright=sz-1;while(left<=right)......
  • 使用countDownLatch 实现 三体动漫中航天服检查流程
      1#include<boost/foreach.hpp>//-lboost_iostreams2#include"muduo/base/CountDownLatch.h"3#include"muduo/base/Thread.h"4#inc......
  • 代码随想录算法训练营day09 | leetcode 28. 实现 strStr()
    LeetCode28.实现strStr()牢记一点:next[i]元素表示【0,i】子串的最长相等前后缀个数,也是模式串与主串匹配不相等时模式串的下一个比较索引分析1.0前缀是指不包含最后......
  • 怎样借助WWW理解并较好地实现编程中的相关功能点
    首先分享一个课程https://www.icourse163.org/learn/SICNU-1002031014借助WWW来学习编程知识是必须的路径,那么怎样才能够如标题那样更好地实现呢?首先我们分析一下如果......