我有一个密码列表生成器,它生成特定长度的特定字符集的所有组合.
当然,列表很长,生成需要很长时间.
我想并行化该过程,但遇到了算法/数学问题.
例如,我想为4个字符长的密码生成[a-z](26个字母)的所有组合.
组合总数为26 ^ 4 = 456.976
并行化为ex.两个进程,我想要一个进程来处理前半部分,另一个处理下半部分.每个228.488组合.
而现在问题是……
应该处理下半部分的过程,我从数字228.488到生成器的字母组合应该从哪个开始?
我正在寻找一个通用的解决方案,所以如果更改字母数或密码长度,它仍然可以工作.
当然这很久以前就已经解决了,也许它甚至有一个名字.我只是不知道这个名字,我不能谷歌.
我在C#中实现这个
谢谢.
最佳答案 您正在探索整个[a-z] ^ 4空间.该空间中有26 ^ 4个不同的元素.
只需将[a-z] ^ 4的元素视为基数为26的4位数.给定一个整数i,您可以在基数26中找到它的表达式并得到您正在寻找的单词.
word[0] = i % 26
word[1] = (i / 26) % 26
word[2] = (i / 26 / 26) % 26
word[3] = (i / 26 / 26 / 26) % 26
如果你有M台机器,索引j的机器可以从索引开始:j *(26 ^ 4 / M).
因此,如果你的机器从索引:228488开始,它将以下面的单词开头:
word[0] = 228488 % 26 = 0 => 'a'
word[1] = (228488 / 26) % 26 = 0 => 'a'
word[2] = (228488 / 26 / 26) % 26 = 0 => 'a'
word[3] = (228488 / 26 / 26 / 26) = 13 => 'm'