我是在创建一个分布式密码破解程序,我将使用强力技术,所以我需要每个字符串组合。
为了分发,Server
会为Client
提供一系列字符串,例如从"aaaa"
到"bxyz"
。我假设字符串长度为4。所以我需要检查这两个边界之间的每个字符串。
我正在尝试用C语言生成这些字符串。我试图为此制作逻辑但是我失败了;我也在谷歌搜索但没有任何好处。有什么想法吗?
修改
对不起兄弟们,我想编辑它
我想要在一个范围内组合字符串,让我们假设aaaa
和aazz
之间的字符串是aaaa aaab aaac aaad ..... aazx aazy aazz
..我的字符空间只是上下英文字母就像52个字符。我想检查4个字符的每个组合。但是Server会在其客户端之间分配字符串范围。我的问题是,如果一个客户端获得aaaa
和aazz
之间的范围,那么我将如何在这些边界之间生成字符串。
答案 0 :(得分:3)
如果您的字符串只能理解ASCII表,那么您将拥有256个字符或2 ^ 8个字符作为上限。
由于您的字符串长度为4个字符,因此您将拥有2^8 * 2^8 * 2^8 * 2^8
个组合,
或2^8^4 = 2^32
组合。
只需分割数字范围并在每台机器中启动组合。
您可能对此感兴趣:Calculating Nth permutation step?
修改强>:
考虑到您的修改,您的组合空间将是52^4 = 7.311.616
组合。
然后,您只需要为每台机器划分这些“任务”进行计算,因此,7.311.616 / n = r
,r
作为每台机器计算的排列量 - 最后一台机器可能计算r + (7.311.616 % n)
组合。
由于您知道要在每台计算机中构建的组合数量,因此您必须在每台计算机上执行以下操作:
function check_permutations(begin, end, chars) {
for (i = begin; i < end; i++) {
nth_perm = nth_permutation(chars, i);
check_permutation(nth_perm); // your function of verification
}
}
函数nth_permutation()
并不难推出,我很确定你可以在我发布的链接中找到它。
在此之后,您只需使用check_permutations
这样的函数启动一个流程,即可生成begin
,end
和字符chars
的字符。
答案 1 :(得分:0)
您可以生成包含所有排列的树。例如,就像在这个伪代码中一样:
strings(root,len)
for(c = 'a' to 'z')
root->next[c] = c
strings(&root->next[c], len - 1)
按strings(root, 4)
调用。
之后,您可以遍历树以获得所有排列。