Короткий уникальный идентификатор в php

Предупреждение: недопустимое смещение строки 'XXX'

Это происходит, когда вы пытаетесь получить доступ к элементу массива с синтаксисом с квадратной скобкой, но вы делаете это по строке, а не по массиву, поэтому операция явно не имеет смысла .

Пример:

$var = "test";
echo $var["a_key"];

Если вы считаете, что переменная должна быть массивом, см., где она появляется и исправить там проблему.

47
задан tereško 1 July 2012 в 19:39
поделиться

8 ответов

Сделайте небольшую функцию, которая возвращает случайные буквы для данной длины:

<?php
function generate_random_letters($length) {
    $random = '';
    for ($i = 0; $i < $length; $i++) {
        $random .= chr(rand(ord('a'), ord('z')));
    }
    return $random;
}

Тогда Вы захотите назвать это, пока это не будет уникально в псевдокоде в зависимости от того, где Вы хранили бы ту информацию:

do {
    $unique = generate_random_letters(6);
} while (is_in_table($unique));
add_to_table($unique);

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

РЕДАКТИРОВАНИЕ: Я также добавил бы, что это только имеет смысл, если, поскольку Вы намереваетесь использовать его, это не для большого количества объектов, потому что это могло стать довольно медленным больше коллизий, которые Вы получаете (получение идентификатора уже в таблице). Конечно, Вы захотите индексируемую таблицу, и Вы захотите настроить количество букв в идентификаторе для предотвращения коллизии. В этом случае, с 6 буквами, Вы имели бы 26^6 = 308 915 776 возможных уникальных идентификаторов (минус ругательства), который должен быть достаточно для Вашей потребности 10 000.

РЕДАКТИРОВАНИЕ: Если Вы хотите комбинации букв и чисел, можно использовать следующий код:

$random .= rand(0, 1) ? rand(0, 9) : chr(rand(ord('a'), ord('z')));
43
ответ дан Manoj Sharma 26 November 2019 в 19:15
поделиться
function rand_str($len = 12, $type = '111', $add = null) {
    $rand = ($type[0] == '1'  ? 'abcdefghijklmnpqrstuvwxyz' : '') .
            ($type[1] == '1'  ? 'ABCDEFGHIJKLMNPQRSTUVWXYZ' : '') .
            ($type[2] == '1'  ? '123456789'                 : '') .
            (strlen($add) > 0 ? $add                        : '');

    if(empty($rand)) $rand = sha1( uniqid(mt_rand(), true) . uniqid( uniqid(mt_rand(), true), true) );

    return substr(str_shuffle( str_repeat($rand, 2) ), 0, $len);
}
0
ответ дан 26 November 2019 в 19:15
поделиться

Буквы симпатичны, цифры ужасны. Вы хотите случайные строки, но не хотите "ужасных" случайных строк?

Создают случайное число и печатают его в альфа-стиль ( основа 26 ), как резервирование "числа", которые дают авиакомпании.

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

Другая альтернатива: используйте uniqid() и избавьтесь от цифр.

function strip_digits_from_string($string) {
    return preg_replace('/[0-9]/', '', $string);
}

Или заменяют их буквами:

function replace_digits_with_letters($string) {
    return strtr($string, '0123456789', 'abcdefghij');
}
3
ответ дан Costin 26 November 2019 в 19:15
поделиться

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

function toUId($baseId, $multiplier = 1) {
    return base_convert($baseId * $multiplier, 10, 36);
}
function fromUId($uid, $multiplier = 1) {
    return (int) base_convert($uid, 36, 10) / $multiplier;
}

echo toUId(10000, 11111);
1u5h0w
echo fromUId('1u5h0w', 11111);
10000

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

4
ответ дан OIS 26 November 2019 в 19:15
поделиться

Существует два способа получить надежно уникальный идентификатор: Делайте его так долго и переменная, что возможности коллизии являются эффектно маленькими (как с GUID) или хранят все сгенерированные идентификаторы в таблице для поиска (или в памяти или в DB или файле) для проверки уникальности на поколение.

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

17
ответ дан Chris 26 November 2019 в 19:15
поделиться

Вот процедура, которую я использую для случайных базовых 62 любой длины ...

Вызов gen_uuid () возвращает такие строки, как WJX0u0jV, E9EMaZ3P и т. Д. .

По умолчанию возвращается 8 цифр, следовательно, пробел равен 64 ^ 8 или примерно 10 ^ 14, этого часто бывает достаточно, чтобы столкновения были довольно редкими.

Для большей или меньшей строки, передайте $ len по желанию. Никаких ограничений по длине, так как я добавляю до тех пор, пока не будет удовлетворено [до предела безопасности в 128 символов, который можно удалить].

Обратите внимание, используйте случайную соль внутри md5 [или sha1, если хотите] , поэтому его нелегко перепроектировать.

Я не нашел никаких надежных преобразований base62 в сети, отсюда и такой подход удаления символов из результата base64.

Используйте свободно под лицензией BSD, наслаждайтесь,

gord

function gen_uuid($len=8)
{
    $hex = md5("your_random_salt_here_31415" . uniqid("", true));

    $pack = pack('H*', $hex);

    $uid = base64_encode($pack);        // max 22 chars

    $uid = ereg_replace("[^A-Za-z0-9]", "", $uid);    // mixed case
    //$uid = ereg_replace("[^A-Z0-9]", "", strtoupper($uid));    // uppercase only

    if ($len<4)
        $len=4;
    if ($len>128)
        $len=128;                       // prevent silliness, can remove

    while (strlen($uid)<$len)
        $uid = $uid . gen_uuid(22);     // append until length achieved

    return substr($uid, 0, $len);
}
11
ответ дан 26 November 2019 в 19:15
поделиться

Действительно простое решение:

Уникальный идентификатор с:

$id = 100;
base_convert($id, 10, 36);

Получите исходное значение снова:

intval($str,36);

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

11
ответ дан 26 November 2019 в 19:15
поделиться

@gen_uuid () от gord.

preg_replace получил некоторые неприятные проблемы с utf-8, из-за которых uid иногда содержал "+" или "/". Чтобы обойти это, вы должны явно сделать шаблон utf-8

function gen_uuid($len=8) {

    $hex = md5("yourSaltHere" . uniqid("", true));

    $pack = pack('H*', $hex);
    $tmp =  base64_encode($pack);

    $uid = preg_replace("#(*UTF8)[^A-Za-z0-9]#", "", $tmp);

    $len = max(4, min(128, $len));

    while (strlen($uid) < $len)
        $uid .= gen_uuid(22);

    return substr($uid, 0, $len);
}

Мне потребовалось много времени, чтобы обнаружить это, возможно, это избавит кого-то от головной боли

28
ответ дан 26 November 2019 в 19:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: