Функция инвертирования:преобразование базы 38
Вопрос
Можете ли вы сказать мне, как работает функция инвертирования для следующей функции 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?Численный алгоритм таков:
- Пусть N - новое число в базе 10.Для начала установите N равным нулю.
- Пусть X - исходное число в базе 38.
- Умножьте N на 38.
- Пусть D - самая значимая (крайняя левая) цифра X.
- Пусть T - значение D в базе 10.
- Добавьте T к N.
- Удалите D из X (таким образом, число X теперь на 1 цифру короче).
- Если X пусто, переходим к 10.
- Переход 3.
- Верните N, которое теперь является полностью преобразованным базовым числом 10.
Теперь, когда вы понимаете математику, преобразовать эти шаги в функцию PHP должно быть довольно просто.
Не связан с StackOverflow