Создавайте короткие уникальные идентификаторы (символы и числа), которые «выглядят» довольно ... как идентификаторы YouTube (PHP) - PullRequest
0 голосов
/ 04 января 2012

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

Так, например, «1» преобразуется в «o7wu» и наоборот. (используйте номер для поиска в БД и строку для отображения)

Я нашел эту замечательную функцию: http://kevin.vanzonneveld.net/techblog/article/create_short_ids_with_php_like_youtube_or_tinyurl/, но сгенерированные идентификаторы действительно некрасиво для небольших чисел, например «1» - это «aacd», а «2» - это «aadd» . Я также обнаружил, что http://blog.kevburnsjr.com/php-unique-hash, сгенерированные идентификаторы выглядят великолепно, но я думаю, что они «только в одну сторону».

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

Для тех, кто не согласен с моим определением симпатичного удостоверения личности: Я определяю довольно как реальную случайную смесь символов и целых. НЕ: aabb33, abc123, aa22cc. ДА: dfh7, ao8f, z6t4 .. и так далее ...

Ответы [ 2 ]

1 голос
/ 04 января 2012

Генераторы случайных чисел могут быть взломаны, чтобы дать меньше случайных чисел.На самом деле, вы можете заставить их использовать одни и те же номера каждый раз.Если вы установите семя на тот же номер, вы получите ту же последовательность.Вот пример, который создает «случайную» строку, передавая одно число.

<?php
$n = 1;

// Any number to be added to the random seed
// Different numbers give different sequences
$offset = 45;

srand($n + $offset);
$code = '';

for($i=0; $i<4; $i++) {
    // Numbers and letters
    $char = rand(48, 57+26);

    // Lower case letters
    if ($char > 57) $char += 39;
    $code .= chr($char);
}

echo "The code is $code\n";

С этим смещением 1 дает «ghep», 2 дает «tw70», 3 дает «ob0c».Чтобы увеличить количество символов, измените $i<4 на 5 или 13. Чтобы изменить включенные символы, используйте другой диапазон ASCII-кодов .

0 голосов
/ 04 января 2012

Я тоже попробовал первую ссылку и с небольшим успехом справился с предоставленным кодом.Я провел некоторое исследование и думаю, что идентификаторы YouTube - это просто случайно сгенерированные строки (учитывая, что существует почти 74 квинтиллиона возможных комбинаций, вероятность того, что два идентификатора будут одинаковыми, очень мала).Ниже приведен небольшой PHP-скрипт, который я использую для создания 11-символьных случайных идентификаторов в стиле YouTube.

$length = 11;
$characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_-';

$random_id = "";

for ($i = 0; $length > $i; $i++) {
    $random_id .= $characters[mt_rand(0, strlen($characters) -1)];
}

Приведенный выше скрипт в основном создает список из 64 символов, идентичных используемым YouTube, случайным образом выбирает одиннадцать изэти символы, а затем объединяет их все в цикле for.Затем я сохраняю случайные идентификаторы, сгенерированные в столбце для случайных идентификаторов, которые ищутся по URL.Он не включает шифрование, но это самое близкое, что я мог придумать.Вы можете изменить длину строки, изменив переменную $ length и символы, используемые для изменения символов, составляющих переменную $ characters.

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

...