Уникальный id как на YouTube

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Аватара пользователя
girmate
Сообщения: 1533
Зарегистрирован: 2015.10.27, 12:52

Re: Уникальный id как на YouTube

Сообщение girmate »

zelenin писал(а):для уникальности есть стандартный uuid и менее стандартные cuid, hashid, snowflakes и уверен еще куча способов.
Но ведь они очень длинные.
Осторожно! Вы общаетесь с новичком ;)

zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Уникальный id как на YouTube

Сообщение zelenin »

girmate писал(а):
zelenin писал(а):для уникальности есть стандартный uuid и менее стандартные cuid, hashid, snowflakes и уверен еще куча способов.
Но ведь они очень длинные.
все 4 вида?

Аватара пользователя
girmate
Сообщения: 1533
Зарегистрирован: 2015.10.27, 12:52

Re: Уникальный id как на YouTube

Сообщение girmate »

zelenin писал(а):
girmate писал(а):
zelenin писал(а):для уникальности есть стандартный uuid и менее стандартные cuid, hashid, snowflakes и уверен еще куча способов.
Но ведь они очень длинные.
все 4 вида?
uuid => 550e8400-e29b-41d4-a716-446655440000 - длинный
cuid => c - h72gsb32 - 0000 - udoc - l363eofy - длинный
hashid => A6OEQjz9 из строки "1467287146" - неплохо!
snowflakes => не найден пример
Осторожно! Вы общаетесь с новичком ;)


kukuruku
Сообщения: 1266
Зарегистрирован: 2011.02.14, 11:36

Re: Уникальный id как на YouTube

Сообщение kukuruku »

ид это обычный int переведенный в другую систему исчисления
http://stackoverflow.com/questions/3990 ... ids-in-php

Аватара пользователя
girmate
Сообщения: 1533
Зарегистрирован: 2015.10.27, 12:52

Re: Уникальный id как на YouTube

Сообщение girmate »

Оставлю здесь для себя. Интересная статья на хабре на тему uuid и тому как (возможно) генерируется id на YouTube: https://habrahabr.ru/post/334994/ и там же в комментариях видео на эту тему: https://www.youtube.com/watch?v=gocwRvLhDf8.
Осторожно! Вы общаетесь с новичком ;)

zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Уникальный id как на YouTube

Сообщение zelenin »

girmate писал(а):
2018.02.03, 15:58
Оставлю здесь для себя. Интересная статья на хабре на тему uuid
практически ничего нет про uuid, кроме некоторой инфы из вики
girmate писал(а):
2018.02.03, 15:58
и тому как (возможно) генерируется id на YouTube
на пхп?)

Аватара пользователя
girmate
Сообщения: 1533
Зарегистрирован: 2015.10.27, 12:52

Re: Уникальный id как на YouTube

Сообщение girmate »

Да, на PHP (ver. >=7.1)

Код: Выделить всё

class Base64UID
{

    private const CHARS = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_-';

    public static function generate(int $length): string
    {
        $uid = '';
        while ($length-- > 0) {
            $uid .= self::CHARS[random_int(0, 63)];
        }

        return $uid;
    }
}
$uid = Base64UID::generate(11);
echo $uid; // pD8R8YrVMrL
;)
Осторожно! Вы общаетесь с новичком ;)

Аватара пользователя
girmate
Сообщения: 1533
Зарегистрирован: 2015.10.27, 12:52

Re: Уникальный id как на YouTube

Сообщение girmate »

zelenin писал(а):
2018.02.03, 16:59
на пхп?)
Sorry, Александр, я не сразу понял что вы имеете в виду. Нет, конечно же я сомневаюсь что на YouTube генерация id выполняется на PHP. Я лишь прикрепил одну из возможных реализации на PHP (код не мой) сюда на форум, чтобы долго не искать.
Осторожно! Вы общаетесь с новичком ;)

zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Уникальный id как на YouTube

Сообщение zelenin »

честно говоря, не пойму какой вообще в этом может быть интерес.

skynin
Сообщения: 220
Зарегистрирован: 2017.12.12, 10:09

Re: Уникальный id как на YouTube

Сообщение skynin »

-- Мне необходим такой id, чтобы исключить подбор путем перебора

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

1. про хранение в БД уже написали
2. генерируем на основе time() + мусор от пользователя. Скажем IP . HTTP_USER_AGENT . еще чего-нить из $_SERVER
3. берем короткий hash с помощью adler32 (fnv132, fnv1a32, joaat, crc32b).
4. смотрим в базу. если такой есть, на шаге 3 берем следующую функцию.
4а. если не удалось, меняем что-то на шаге 2
5. записываем новенький уникальный id.
6. отдаем пользователю.

на шаге 2 можно добавить еще рандомного мусора.
на шаге 2 можно брать только 2 младших байта от time()
на шаге 3 можно добавить рандомный выбор функции для хеширования.
на шаге 3 можно добавить к хэшу dechex (что у нас хешировалось)
Последний раз редактировалось skynin 2018.02.13, 12:37, всего редактировалось 2 раза.

snewer
Сообщения: 44
Зарегистрирован: 2016.08.05, 13:10

Re: Уникальный id как на YouTube

Сообщение snewer »

Храните в бд обычный числовой идентификатор.
А на выходе конвертируйте его в другую систему счисления ([A-Za-z0-9-]) и обратно. Алгоритмы легко гуглятся.
Например, если достаточно [a-z0-9], то можно использовать следующий код:

$id = 1000;
// Получим строку
$stringId = base_convert($id, 10, 35);
// Обратно
base_convert($stringId, 35, 10);
---------------------------------------------------------------------------------
upd. Извините, не заметил, что вам нужна защита от перебора.
Последний раз редактировалось snewer 2018.02.13, 12:30, всего редактировалось 1 раз.

zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Уникальный id как на YouTube

Сообщение zelenin »

и насколько он короткий будет? id восьми символов длиной например является подбираемым.

skynin
Сообщения: 220
Зарегистрирован: 2017.12.12, 10:09

Re: Уникальный id как на YouTube

Сообщение skynin »

zelenin писал(а):
2018.02.13, 12:29
и насколько он короткий будет? id восьми символов длиной например является подбираемым.
если на сервере нельзя установить защиту от брутфорса, то конечно тогда надо увеличивать длину.
в моем велосипеде, заменив на md4 и md5

zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Уникальный id как на YouTube

Сообщение zelenin »

skynin писал(а):
2018.02.13, 12:35
zelenin писал(а):
2018.02.13, 12:29
и насколько он короткий будет? id восьми символов длиной например является подбираемым.
если на сервере нельзя установить защиту от брутфорса, то конечно тогда надо увеличивать длину.
в моем велосипеде, заменив на md4 и md5
ну и возвращаемся к стандарту де-факто - uuid, одного размера с md4/5

skynin
Сообщения: 220
Зарегистрирован: 2017.12.12, 10:09

Re: Уникальный id как на YouTube

Сообщение skynin »

zelenin писал(а):
2018.02.13, 12:40
ну и возвращаемся к стандарту де-факто - uuid, одного размера с md4/5
да :D

но:
uuid, но он слишком длинный

в принципе можно взять uuid, почистить его, чтобы был нормальным числом, и скормить base_convert с tobase=36

Код: Выделить всё

// 550e8400-e29b-41d4-a716-446655440000 из https://ru.wikipedia.org/wiki/UUID
echo  base_convert('550e8400e29b41d4a716446655440000', 16, 36);

550e8400e29b41d4a716446655440000
51a37iakuf8kssksgkwckoggg

zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Уникальный id как на YouTube

Сообщение zelenin »

skynin писал(а):
2018.02.13, 12:48
zelenin писал(а):
2018.02.13, 12:40
ну и возвращаемся к стандарту де-факто - uuid, одного размера с md4/5
да :D

но:
uuid, но он слишком длинный
он одного размера с md4/md5 - 128 бит.

skynin
Сообщения: 220
Зарегистрирован: 2017.12.12, 10:09

Re: Уникальный id как на YouTube

Сообщение skynin »

zelenin писал(а):
2018.02.13, 12:51
он одного размера с md4/md5 - 128 бит.
так дело ж не в битах
-- При полном использовании всех знаков латиницы + все цифры
а в хранении, отображении

то есть надо нагуглить base_convert который использует латинские буквы в двух регистрах.

Encoding like base36 including uppercase
Generating IDs like Youtube or Bit.ly using PHP

zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Уникальный id как на YouTube

Сообщение zelenin »

skynin писал(а):
2018.02.13, 13:03
zelenin писал(а):
2018.02.13, 12:51
он одного размера с md4/md5 - 128 бит.
так дело ж не в битах
как не в битах? ты же биты будешь интерпретировать в строку? значит разницы нет между md4/5 и uuid при одинаковом методе интепретации.
не знаю причем здесь base_convert - я про md4/5 vs uuid.

skynin
Сообщения: 220
Зарегистрирован: 2017.12.12, 10:09

Re: Уникальный id как на YouTube

Сообщение skynin »

-- как не в битах?
я предложил лисапед, которым можно играться по длине в битах - от 32ух до сколько нужно-хочется. можно и ripemd320 использовать.

-- не знаю причем здесь base_convert
далее, эти биты, неважно сколько, нужно еще покороче кодировать.
как - тоже подсказал.

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

Ответить