【问题标题】:every 10 character/number combination每 10 个字符/数字组合
【发布时间】:2014-03-11 18:22:15
【问题描述】:

好的,我已经为此苦苦挣扎了一段时间,尝试使用 excel 和其他工具来生成每一个可能的 10 个字符/数字组合,我决定用代码尝试一下?我用 javascript 尝试过,但似乎找不到任何执行此操作的代码,我不希望任何重复项都以 .txt 文档结尾。理想情况下,每行 1 个输出。在此先感谢,我不介意使用其他语言,例如 PHP,但只需要帮助:/ 我曾尝试在 php 中做到这一点,我的代码在我的网站下面。然后下面是代码实际执行的操作。再次感谢史蒂夫。

它不允许我在这里发布我的代码,所以它在http://stephengoodings.com/combination/show.html

它会生成这个http://stephengoodings.com/combination/

【问题讨论】:

标签: php combinations


【解决方案1】:

你说我不太明白你的代码

可能的每一个 10 个字符/数字组合

但您的代码会生成三个符号的组合。

无论如何,我认为更简单的方法是考虑您对序列中的每个位置使用 36 个符号 - A 到 Z,0 到 9。如果你有一个 one 字符序列,那将给你 36 种可能性,你可以从 0 到 35 编号。

如果你有一个 two 字符序列,你会得到第一个位置的 36 种可能性,第二个位置每个都有 36 种可能性,即 36 乘以 36(从 00 到 0A 到0Z,然后是 A0,通过 ZZ) 或 36 的二次方。

所以如果你有 10 个位置,你最终会得到 36 的 10 次方;从 0 到 那个 数字(减 1)的每个数字将唯一标识一个且只有一个组合。您只需在 for 循环中枚举它们。

反过来,从一个数字变成一个组合,你可以使用模运算:

$symbols = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
for ($i = 0; $i < BIG_NUMBER; $i++) {
    $start = $i;
    $seq   = '';
    for ($j = 0; $j < 10; $j++) {
        $k = $start % strlen($symbols);
        $start /= strlen($symbols);
        $sq  .= $symbols[$k];  // or $seq = $symbol[$k] . $seq;
    }
    print "$seq\n";
}

请注意,36 的 10 次方是 3656158440062976。虽然它可以由 64 位数字保存,但要花很长时间非常生成所有组合。

每秒 100 万次组合,我认为这大约是 115 年。

此外,11 个(十个字符和一个换行符)乘以 36 到第 10 个超过 30000 TB。

我认为您最好确定您需要该序列的目的,并以不同的方式解决问题。

例如:如果您需要并行暴力破解密码,例如在一百台计算机之间,您可以为每台计算机分配序列的一部分,以免重复工作,然后让每台计算机尝试解码并保存正在检查的 current 组合,而不是保存过去的组合。由于这些组合是按递增顺序枚举的,并且您知道每个系统的起点和终点,因此您不会丢失任何信息,并且可以节省大量内存和磁盘空间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-13
    • 2013-09-20
    • 1970-01-01
    相关资源
    最近更新 更多