代码之家  ›  专栏  ›  技术社区  ›  Mark Tomlin

如何建立字符表

  •  0
  • Mark Tomlin  · 技术社区  · 14 年前
    $chars = array
    (
        ' ',
        '!', '"', '#', '$', '%', '&', '\'', '(', ')', '*', '+', ',', '-', '.', '/',
        0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
        ':', ';', '<', '=', '>', '?', '`',
        'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
        'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
        '{', '|', '}', '~'
    );
    

    $chars $n .

    **For Example**:
    It should start off with ' ', and then go to '!'.
    Once it gets to the end of the $chars array (`~`) it should add on another charter.
    Run though those combinations ('! ', '" ', ... '~ ', ' !' ... '~~', '   ', ect).
    And then just keep on going ... 
    
    3 回复  |  直到 14 年前
        2
  •  0
  •   arunas_t    14 年前

    如果你只想找到一些可能的组合,这将是组合-置换数学-你必须提高你的长度$n到你的数组元素的幂次方。在Php中:

    echo pow($n, count($chars)); 
    

    数学参考: combinations - permutations

    另外,我要向Zackmans的解决方案致敬,但我想知道它(以及其他任何解决方案)是否会因为问题的范围而导致PHP脚本超时。

        3
  •  0
  •   Zackman    14 年前

    此函数将接受一个数组 $permutation 仅包含来自另一个数组的元素 $set 并生成下一个最大长度为 $max .

    function next_permutation($permutation, $set, $max)
    {
        if (array_unique($permutation) === array(end($set)))
        {
            if (count($permutation) === $max)
            {
                return FALSE;
            }
    
            return array_fill(0, count($permutation) + 1, $set[0]);
        }
    
        foreach (array_reverse($permutation, TRUE) as $key => $value)
        {
            if ($value !== end($set))
            {
                $permutation[$key] = $set[array_search($value, $set) + 1];
                break;
            }
    
            $permutation[$key] = $set[0];
        }
    
        return $permutation;
    }
    

    然后可以这样使用函数,迭代每个可能的排列,并根据哈希密码检查它。

    $set         = array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z');
    $max         = 3;
    $permutation = array($set[0]);
    $password    = '403926033d001b5279df37cbbe5287b7c7c267fa';
    
    do {
        $string = implode('', $permutation);
    
        if (sha1($string) === $password)
        {
            echo 'Password found: "'.$string.'"';
            break;
        }
    } while ($permutation = next_permutation($permutation, $set, $max));
    

    Password found: "lol"