Страница 2 из 3

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

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

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

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

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

Добавлено: 2016.06.30, 14:49
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 => не найден пример

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

Добавлено: 2016.06.30, 16:48
Loveorigami

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

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

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

Добавлено: 2018.02.03, 15:58
girmate
Оставлю здесь для себя. Интересная статья на хабре на тему uuid и тому как (возможно) генерируется id на YouTube: https://habrahabr.ru/post/334994/ и там же в комментариях видео на эту тему: https://www.youtube.com/watch?v=gocwRvLhDf8.

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

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

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

Добавлено: 2018.02.12, 11:37
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
;)

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

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

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

Добавлено: 2018.02.13, 01:36
zelenin
честно говоря, не пойму какой вообще в этом может быть интерес.

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

Добавлено: 2018.02.13, 12:25
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 (что у нас хешировалось)

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

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

$id = 1000;
// Получим строку
$stringId = base_convert($id, 10, 35);
// Обратно
base_convert($stringId, 35, 10);
---------------------------------------------------------------------------------
upd. Извините, не заметил, что вам нужна защита от перебора.

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

Добавлено: 2018.02.13, 12:29
zelenin
и насколько он короткий будет? id восьми символов длиной например является подбираемым.

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

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

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

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

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

Добавлено: 2018.02.13, 12:48
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

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

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

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

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

Добавлено: 2018.02.13, 13:03
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

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

Добавлено: 2018.02.13, 13:07
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.

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

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

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

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