Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/229.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 类似于base36的编码,包括大写字母_Php - Fatal编程技术网

Php 类似于base36的编码,包括大写字母

Php 类似于base36的编码,包括大写字母,php,Php,我使用base36来缩短URL。我有一个博客条目的id,并将该id转换为base36以使其更小。Base36仅包括小写字母。如何包含大写字母?如果我使用base64_编码,它实际上会使字符串变长 function dec2any( $num, $base=62, $index=false ) { // Parameters: // $num - your decimal integer // $base - base to which you wish to c

我使用base36来缩短URL。我有一个博客条目的id,并将该id转换为base36以使其更小。Base36仅包括小写字母。如何包含大写字母?如果我使用base64_编码,它实际上会使字符串变长

function dec2any( $num, $base=62, $index=false ) {

    // Parameters:
    //   $num - your decimal integer
    //   $base - base to which you wish to convert $num (leave it 0 if you are providing $index or omit if you're using default (62))
    //   $index - if you wish to use the default list of digits (0-1a-zA-Z), omit this option, otherwise provide a string (ex.: "zyxwvu")

    if (! $base ) {
        $base = strlen( $index );
    } else if (! $index ) {
        $index = substr( "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" ,0 ,$base );
    }
    $out = "";
    for ( $t = floor( log10( $num ) / log10( $base ) ); $t >= 0; $t-- ) {
        $a = floor( $num / pow( $base, $t ) );
        $out = $out . substr( $index, $a, 1 );
        $num = $num - ( $a * pow( $base, $t ) );
    }
    return $out;
}

无耻地从PHP的
base\u convert()
页面(
base\u convert()
仅适用于base 32)上的评论员那里借用。您可以找到一些源代码示例,用于在这两篇文章中创建包含字母(小写和大写)和数字的短URL,例如:

以下是第二篇文章中使用的代码部分(引用):

你可以很容易地把它封装在一个函数中——只需要考虑的是<代码> $N/COD>将作为参数接收:

function shorten($n) {
    $codeset = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
    $base = strlen($codeset);
    $converted = "";
    while ($n > 0) {
      $converted = substr($codeset, ($n % $base), 1) . $converted;
      $n = floor($n/$base);
    }
    return $converted;
}
这样说:

$id = 123456;
$url = shorten($id);
var_dump($url);
你会得到:

string 'w7e' (length=3)
(如果需要,您还可以添加一些其他字符,具体取决于您希望在URL中获得的内容)


在评论后编辑:

阅读第二篇文章(我从中获得了缩短代码),您将发现执行取消缩短的代码

将代码封装到函数中应该没有那么困难,可能会得到如下结果:

function unshorten($converted) {
    $codeset = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
    $base = strlen($codeset);
    $c = 0;
    for ($i = strlen($converted); $i; $i--) {
      $c += strpos($codeset, substr($converted, (-1 * ( $i - strlen($converted) )),1)) 
            * pow($base,$i-1);
    }
    return $c;
}
并使用缩短的url调用它:

$back_to_id = unshorten('w7e');
var_dump($back_to_id);
将为您提供:

int 123456

这不是随机的,对吗?这与base32基本相同,但添加了大写字母?,因为此函数使用诸如log10和pow之类的浮点运算。有些输入值可能会出现舍入错误。输入值只是数字…?但数字是整数,然后对它们进行浮点运算。可能这对所有可能的输入都没问题,但当我看到人们在做log10()时,就会发出一个红色的信号。很难证明(除了蛮力)该算法对所有输入都适用。在这种情况下,也没有必要——Pascal的答案只适用于integer math。我同意帕斯卡的答案,但我将把它留在这里,让大家好好讨论一下。一旦用这种方法编码,我将如何继续解码它?@mistero:在我链接的文章中,有编码和解码代码,你可以将它们包装成一个函数,就像我对编码代码所做的那样;;尽管如此,我还是编辑了我的答案,以显示它可能是什么样子。仅供参考-base64之所以生成更长的字符串,是因为它实际上是在编码数字的字符串形式(即“123456”)。
int 123456