Invert fonksiyonu: Taban 38 dönüştürme

3 Cevap php

Eğer aşağıdaki PHP fonksiyonu için invert işlevi nasıl bana söyleyebilir?

<?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);
?>

Şimdiden çok teşekkür ederiz!

3 Cevap

Bu güvenli :) çatlamak bana birkaç dakika sürdü değildir. Buyrun,

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;
}

Bu kodu test değil, ama işe yarayabilir:

<?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;
} ?>

`

Eğer 10 tabanına tabanı 38 dönüştürmek için nasıl soruyorsunuz? Sayısal algoritma şudur:

  1. N sıfıra 10 tabanına yeni numara. Set N olmak ile başlamak için izin.
  2. X taban 38, orijinal sayısı olsun.
  3. 38 ile N çarpın.
  4. D X'in en önemli (en soldaki) rakam olalım
  5. T 10 tabanına D değeri olsun.
  6. N'ye T ekleme
  7. (Yani sayı X artık 1 basamak daha kısadır) X D çıkarın.
  8. X boşsa, 10 gidiniz.
  9. Goto 3.
  10. Şimdi tamamen dönüştürülen baz 10 sayı N dönmek.

Şimdi matematik anlamak, o bir PHP fonksiyonu için şu adımları dönüştürmek oldukça basit olmalıdır.