создание уникального идентификатора длиной 6 символов с использованием только a-z A-Z 0-9 - PullRequest
1 голос
/ 27 мая 2011

Я сам пытался написать функцию, хотя она не работает должным образом, и теперь я вижу логический недостаток.

$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 />';
}

Это даст следующий вывод: https://gist.github.com/937b148a126924b9429d

Как мне действительно сгенерировать уникальный идентификатор длиной 6 символов, используя только a-z A-Z 0-9 и используя логическое увеличение?

Ответы [ 2 ]

3 голосов
/ 27 мая 2011

Как мне сгенерировать уникальный идентификатор длиной 6 символов, используя только a-z A-Z 0-9 и используя логическое увеличение?

Если им нужно увеличить с шагом 1, начните с 0, затем увеличьте на 1 и преобразуйте полученное число в base62 (26 из [AZ] + 26 из [az] + 10 из [0-9]).

Стоп, когда длина больше не подходит (62^6 - 1, если я не ошибаюсь).

1 голос
/ 27 мая 2011

Вы можете использовать эту функцию:

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

Пример использования ( @ IDEOne.com ):

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

while (strlen($string) <= 6)
{
    echo $string = str_pad(Base(++$i, 10, 62, $charset), 6, 'a', STR_PAD_LEFT);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...