Функция инвертирования:преобразование базы 38

StackOverflow https://stackoverflow.com/questions/1449774

  •  11-09-2019
  •  | 
  •  

Вопрос

Можете ли вы сказать мне, как работает функция инвертирования для следующей функции 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 - значение D в базе 10.
  6. Добавьте T к N.
  7. Удалите D из X (таким образом, число X теперь на 1 цифру короче).
  8. Если X пусто, переходим к 10.
  9. Переход 3.
  10. Верните N, которое теперь является полностью преобразованным базовым числом 10.

Теперь, когда вы понимаете математику, преобразовать эти шаги в функцию PHP должно быть довольно просто.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top