Php 仅使用a-z a-z 0-9生成6个字符长的唯一ID

Php 仅使用a-z a-z 0-9生成6个字符长的唯一ID,php,math,logic,Php,Math,Logic,我自己也尝试过编写这个函数,尽管它没有像预期的那样工作,现在我看到了逻辑缺陷 $string = 'aaaaaa'; function hp_update_uid($string) { $position = strpos($string, '9'); if($position === 0) { return FALSE; } elseif($position === FALSE)

我自己也尝试过编写这个函数,尽管它没有像预期的那样工作,现在我看到了逻辑缺陷

$string             = 'aaaaaa';

function hp_update_uid($string)
{
    $position           = strpos($string, '9');



    if($position === 0)
    {
        return FALSE;
    }
    elseif($position === FALSE)
    {
        $position   = -1;
    }
    else
    {
        $position   = -(7-$position);
    }

    #var_dump($position);
    #exit;

    $character_ord      = ord(substr($string, $position, 1));

    if($character_ord == 122)
    {
        $character_ord  = 65;
    }
    elseif($character_ord == 90)
    {
        $character_ord = 48;
    }
    else
    {
        ++$character_ord;
    }

    $string             = substr_replace($string, chr($character_ord), $position, 1);

    return $string;
}

for($i = 0; $i < 1000; $i++)
{
    $string = hp_update_uid($string);
    echo $string . '<br />';
}
$string='aaaaaa';
函数hp\u update\u uid($string)
{
$position=strpos($string,'9');
如果($position==0)
{
返回FALSE;
}
elseif($position==FALSE)
{
$position=-1;
}
其他的
{
$position=-(7-$position);
}
#var_dump($位置);
#退出;
$character_ord=ord(substr($string,$position,1));
如果($character_ord==122)
{
$character_ord=65;
}
elseif($character\u ord==90)
{
$character_ord=48;
}
其他的
{
++$character_ord;
}
$string=substr\u replace($string,chr($character\u ord),$position,1);
返回$string;
}
对于($i=0;$i<1000;$i++)
{
$string=hp\u update\u uid($string);
回显$string。“
”; }
这将产生以下输出:

如何仅使用a-z a-z 0-9和逻辑递增生成6个字符长的唯一ID

如何仅使用a-z a-z 0-9和逻辑递增生成6个字符长的唯一ID

如果需要按1的步长递增,则从0开始,然后递增1,并将结果转换为base62中的数字(从[A-Z]中的26+从[A-Z]中的26+从[0-9]中的10)

当长度不再合适时停止(
62^6-1
如果我没有弄错的话)

如何仅使用a-z a-z 0-9和逻辑递增生成6个字符长的唯一ID

如果需要按1的步长递增,则从0开始,然后递增1,并将结果转换为base62中的数字(从[A-Z]中的26+从[A-Z]中的26+从[0-9]中的10)


当长度不再合适时停止(
62^6-1
,如果我没有弄错的话)。

您可以使用此功能:

function Base($number, $input, $output, $charset = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ')
{
    if (strlen($charset) >= 2)
    {
        $input = max(2, min(intval($input), strlen($charset)));
        $output = max(2, min(intval($output), strlen($charset)));
        $number = ltrim(preg_replace('~[^' . preg_quote(substr($charset, 0, max($input, $output)), '~') . ']+~', '', $number), $charset[0]);

        if (strlen($number) > 0)
        {
            if ($input != 10)
            {
                $result = 0;

                foreach (str_split(strrev($number)) as $key => $value)
                {
                    $result += pow($input, $key) * intval(strpos($charset, $value));
                }

                $number = $result;
            }

            if ($output != 10)
            {
                $result = $charset[$number % $output];

                while (($number = intval($number / $output)) > 0)
                {
                    $result = $charset[$number % $output] . $result;
                }

                $number = $result;
            }

            return $number;
        }

        return $charset[0];
    }

    return false;
}
示例用法():

$i=-1;
$string='';
$charset='abcdefghijklmnopqrstuvxyzabcdefghijklmnopqrstuvxyzo123456789';

而(strlen($string)您可以使用此函数:

function Base($number, $input, $output, $charset = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ')
{
    if (strlen($charset) >= 2)
    {
        $input = max(2, min(intval($input), strlen($charset)));
        $output = max(2, min(intval($output), strlen($charset)));
        $number = ltrim(preg_replace('~[^' . preg_quote(substr($charset, 0, max($input, $output)), '~') . ']+~', '', $number), $charset[0]);

        if (strlen($number) > 0)
        {
            if ($input != 10)
            {
                $result = 0;

                foreach (str_split(strrev($number)) as $key => $value)
                {
                    $result += pow($input, $key) * intval(strpos($charset, $value));
                }

                $number = $result;
            }

            if ($output != 10)
            {
                $result = $charset[$number % $output];

                while (($number = intval($number / $output)) > 0)
                {
                    $result = $charset[$number % $output] . $result;
                }

                $number = $result;
            }

            return $number;
        }

        return $charset[0];
    }

    return false;
}
示例用法():

$i=-1;
$string='';
$charset='abcdefghijklmnopqrstuvxyzabcdefghijklmnopqrstuvxyzo123456789';

while(strlen($string)你所说的逻辑增长是什么意思?你的意思是你不只是想要AAAAA、AAAAA B、AAAAA C等等,而且还想要AAAAA?@Sascha Galley,没错。你所说的逻辑增长是什么意思?你的意思是你不只是想要AAAAA、AAAAA B、AAAAA C等等,还想要AAAAA吗?@Sascha Galley,没错。好的,我不确定。你能用a来说明这一点吗n示例?取一个普通整数,每次递增1。然后转换为base62(即,类似于转换为十六进制,但使用
[0-9a-zA-Z]
字母表而不是
[0-9a-f]
).
0
0
1
1
,…
10
a
11
b
,…
61
Z
62
10
63
11
72
1a
62
zz1是
。请参阅此处了解一些base 62转换PHP代码:虽然它会生成X,但这应该会生成zzzz。不必等待,似乎PHP不理解输入中的62^6。它工作正常。谢谢。@Guy:在PHP中,^不是XOR运算符(或其他二进制运算符)吗?:-)好的,我不确定我是否理解。你能用一个例子来说明这一点吗?取一个普通整数,每次递增1。然后转换为base62(即,类似于转换为十六进制,但使用
[0-9a-zA-Z]
字母表而不是
[0-9a-f]
).
0
0
1
1
,…
10
a
11
b
,…
61
Z
62
10
63
11
72
1a
62
zz1是
。请参阅此处了解一些base 62转换PHP代码:虽然它会生成X,但这应该会生成zzzz。不必等待,似乎PHP不理解输入中的62^6。它工作正常。谢谢。@Guy:在PHP中,^不是XOR运算符(或其他二进制运算符)吗?:-)