用于从笛卡尔集中选择特定集的逻辑

时间:2014-03-08 12:57:28

标签: c# brute-force cartesian-product set-theory

我正在使用密码暴力强制工具作为学习练习,我希望它可以恢复。

所以,我想要的是能够说,这是一组可能的字符,如果我计算出这个设置的每个可能组合的笛卡尔集合长度为n,那么x点的设置是什么? / p>

但是,我想在不计算整个集合的情况下这样做。我在网上看到了类似的逻辑,但是我无法将其概括为适合。

任何帮助都会很棒,谢谢!如果有帮助的话,我会精通C#。

编辑:这是我之前提到的问题:How to select specific item from cartesian product without calculating every other item

编辑:这是我的意思的一个例子:

Char set = [abcd]

Length n = 4

Permutations:

[aaaa]
[aaab]
[aaac]
[aaad]
[aaba]
....
[dddd]

所以,如果我在4点搜索这个集合,我会得到[aaad]。但是,如果我正在搜索元素7000,那么到达那一点需要很长时间。

1 个答案:

答案 0 :(得分:1)

这实现了您链接问题的答案:

static string Get(string chars, int n, int i)
{
    string ret = "";
    int sizes = 1;
    for (int j = 0; j < n; j++) {
        ret = chars[(i / sizes) % chars.Length] + ret;
        sizes *= chars.Length;
    }
    return ret;
}

示例:

string chars = "abcd";
int n = 3;

for (int i = 0; i < Math.Pow(chars.Length, n); i++)
    Console.WriteLine(i + "\t" + Get(chars, n, i));
0       aaa
1       aab
2       aac
3       aad
...
61      ddb
62      ddc
63      ddd