генерирование уникальных идентификаторов в php (для сокращения URL)

Как я могу сгенерировать уникальные комбинации максимум 6 символов в php, используя (0 – 9), (a – z) и (A – Z)? Сколько возможных комбинаций будет? (например, AAaa будет отличаться от Aaaa)?

Использование base_convert($number, 10, 36) не будет обрабатывать az иначе, чем AZ как указано в вопросе. Требуются пользовательские функции.

Используйте столбец int в вашей БД в качестве первичного ключа, который автоматически увеличивает при вставке, а затем конвертирует этот идентификатор из десятичной в base-62 в вашу логику для постоянной ссылки (62 позволяет использовать 0-9, az и AZ).

При создании новой постоянной ссылки:

 <?php /** * Convert decimal int to a base-62 string * * @param int $dec * @returns string */ function toBase62 ($dec) { // 0 is always 0 if ($dec == 0) return "0"; // this array maps decimal keys to our base-62 radix digits $values = array( "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z" ); // convert negative numbers to positive. $neg = $dec < 0; if ($neg) $dec = 0 - $dec; // do the conversion: $chars = array(); // this will store our base-62 chars while ($dec > 0) { $val = $dec % 62; $chars[] = $values[$val]; $dec -= $val; $dec /= 62; } // add zero-padding: while (count($chars) < 6) $chars[] = '0'; // convert to string $rv = implode( '' , array_reverse($chars) ); // if input was negative: return $neg ? "-$rv" : $rv; } // Usage example: // ... do mysql insert here and retrieve new insert_id into var $id ... $permalink = toBase62($id); ?> 

При декодировании запрошенной постоянной ссылки:

 <?php /** * Convert base-62 string to a decimal int * * @param string $str * @returns int on success, FALSE on failure */ function base62ToInt ($str) { // validate str: if ( ! preg_match('/^\-?[0-9A-Za-z]+$/', $str) ) return FALSE; // not a valid string // 0 is always 0 if ($str == "0" ) return 0; // this array maps decimal keys to our base-62 radix digits $values = array( "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z" ); // flip $values so it maps base-62 digits to decimal values: $values = array_flip($values); // get chars from $str: $chars = str_split($str); // convert negative numbers to positive. $neg = $chars[0] == '-'; if ($neg) array_shift($chars); // do the conversion: $val = 0; $i = 0; while ( count($chars) > 0 ) { $char = array_pop($chars); $val += ($values[$char] * pow(62, $i) ); ++$i; } return $neg ? 0 - $val : $val; } // Usage example: // ... assuming permalink has been put in a var called $permalink $id = base62ToInt($permalink); // ... now look up $id in DB ?> 

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

С точки зрения генерации кода из числа, мое предложение было бы простой заменой, поэтому создайте строку со всеми вашими возможными символами и преобразуйте ваш номер в базу 62 (количество всех символов), заменяя букву или номер для каждого.

 AaBbCcDd...0123456789 

(в сторону, я бы предложил удалить lIioO01, поскольку все они выглядят очень похожими)

Как предложил Дэн Гроссман в комментарии ниже, следующий код даст вам очень хорошее приближение к тому, что вы хотите.

 $code = base_convert($number, 10, 36); 

Это даст вам число, основанное на числах и буквах 0-9 и az.