我有一个密码列表生成器,可以生成特定长度的特定字符集的所有组合。 当然,列表很长,生成需要很长时间。
我希望并行化该过程,但遇到了算法/数学问题。
例如,我想为4个字符长的密码生成[a-z](26个字母)的所有组合。 组合总数为26 ^ 4 = 456.976
并行化为ex。两个进程,我想要一个进程来处理前半部分,另一个处理下半部分。每个228.488组合。
现在问题...... 应该处理下半部分的过程,从数字228.488到生成器的字母组合应该从哪个开始?
我正在寻找一般解决方案,因此如果更改了字母数或密码长度,它仍然有效。 当然这很久以前就已经解决了,也许它甚至有一个名字。我只是不知道这个名字,我也无法谷歌。
我在C#中实现这一点
感谢。
答案 0 :(得分:2)
您正在探索整个[a-z]^4
空间。该空间中有26^4
个不同的元素。
只需将[a-z]^4
的元素视为基数26
中的4位数字。给定整数i
,您可以在基数26中找到它的表达式并获得您正在寻找的word
。
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'