你能告诉我以下 PHP 函数的反转函数是怎样的吗?

<?php
function id2secure($old_number) {
    $alphabet_en = '1357902468acegikmoqsuwybdfhjlnprtvxz-_';
    $new_number = '';
    while ($old_number > 0) {
        $rest = $old_number%38;
        if ($rest >= 38) { return FALSE; }
        $new_number .= $alphabet_en[$rest];
        $old_number = floor($old_number/38);
    }
    $new_number = strrev($new_number);
    return $new_number;
}
echo id2secure(172293);
?>

预先非常感谢您!

有帮助吗?

解决方案

这是安全的:)我花了几分钟的时间来破解它。在这里,你走了,

function secure2id($new_number) {
        $alphabet_en = '1357902468acegikmoqsuwybdfhjlnprtvxz';
        $old_number = 0;
        $new_number = strrev($new_number);
        $len=strlen($new_number);
        $n=0;
        $base=1;
        while($n<$len){
            $c=$new_number[$n];
            $index = strpos($alphabet_en, $c);
            if ($index === false)
                 break;
            $old_number += $base * $index;
            $base *= 38;
            $n++;
        }
        return $old_number;
}

其他提示

没有测试的代码,但它可能工作:

<?php function secure2id($sr)
{
  $s = strrev($sr);
  $alpha = '1357902468acegikmoqsuwybdfhjlnprtvxz';
  $alpha2num = array();
  $n = strlen($alpha);
  for($i = 0; $i < $n; $i++)
  {
    $alpha2num[$alpha[$i]] = $i;
  }
  $rez = 0;
  $n = strlen($s);
  $b = 1;
  for($i = 0; $i < $n; $i++)
  {
    $rez += $b * $alpha2num[$s[$i]];
    $b *= 38;
  }
  return $rez;
} ?>

`

您想问如何将 38 进制转换为 10 进制吗?数值算法是这样的:

  1. 令 N 为以 10 为基数的新数字。首先将 N 设置为零。
  2. 令 X 为以 38 为基数的原始数字。
  3. 将 N 乘以 38。
  4. 令 D 为 X 的最高有效(最左边)数字。
  5. 令 T 为以 10 为底的 D 值。
  6. 将 T 添加到 N。
  7. 从 X 中删除 D(因此数字 X 现在短了 1 位)。
  8. 如果 X 为空,则转到 10。
  9. 转到3。
  10. 返回 N,它现在是完全转换的以 10 为基数的数字。

现在您已经了解了数学原理,将这些步骤转换为 PHP 函数应该相当简单。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top