Но ведь они очень длинные.zelenin писал(а):для уникальности есть стандартный uuid и менее стандартные cuid, hashid, snowflakes и уверен еще куча способов.
Уникальный id как на YouTube
Re: Уникальный id как на YouTube
Осторожно! Вы общаетесь с новичком
Re: Уникальный id как на YouTube
все 4 вида?girmate писал(а):Но ведь они очень длинные.zelenin писал(а):для уникальности есть стандартный uuid и менее стандартные cuid, hashid, snowflakes и уверен еще куча способов.
Re: Уникальный id как на YouTube
uuid => 550e8400-e29b-41d4-a716-446655440000 - длинныйzelenin писал(а):все 4 вида?girmate писал(а):Но ведь они очень длинные.zelenin писал(а):для уникальности есть стандартный uuid и менее стандартные cuid, hashid, snowflakes и уверен еще куча способов.
cuid => c - h72gsb32 - 0000 - udoc - l363eofy - длинный
hashid => A6OEQjz9 из строки "1467287146" - неплохо!
snowflakes => не найден пример
Осторожно! Вы общаетесь с новичком
-
- Сообщения: 977
- Зарегистрирован: 2014.08.27, 21:54
Re: Уникальный id как на YouTube
ид это обычный int переведенный в другую систему исчисления
http://stackoverflow.com/questions/3990 ... ids-in-php
http://stackoverflow.com/questions/3990 ... ids-in-php
Re: Уникальный id как на YouTube
Оставлю здесь для себя. Интересная статья на хабре на тему uuid и тому как (возможно) генерируется id на YouTube: https://habrahabr.ru/post/334994/ и там же в комментариях видео на эту тему: https://www.youtube.com/watch?v=gocwRvLhDf8.
Осторожно! Вы общаетесь с новичком
Re: Уникальный id как на YouTube
Да, на 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
Sorry, Александр, я не сразу понял что вы имеете в виду. Нет, конечно же я сомневаюсь что на YouTube генерация id выполняется на PHP. Я лишь прикрепил одну из возможных реализации на PHP (код не мой) сюда на форум, чтобы долго не искать.
Осторожно! Вы общаетесь с новичком
Re: Уникальный id как на YouTube
честно говоря, не пойму какой вообще в этом может быть интерес.
Re: Уникальный id как на YouTube
-- Мне необходим такой 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 (что у нас хешировалось)
если генерировать самому (писать свой велосипед), и чтобы получился короткий, то
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 раза.
Не желайте странного, и не будет у вас головной боли чтобы достичь этого странного.
Тем более что окажется что оно вам и не нужно было, странное это.
Тем более что окажется что оно вам и не нужно было, странное это.
Re: Уникальный id как на YouTube
Храните в бд обычный числовой идентификатор.
А на выходе конвертируйте его в другую систему счисления ([A-Za-z0-9-]) и обратно. Алгоритмы легко гуглятся.
Например, если достаточно [a-z0-9], то можно использовать следующий код:
$id = 1000;
// Получим строку
$stringId = base_convert($id, 10, 35);
// Обратно
base_convert($stringId, 35, 10);
---------------------------------------------------------------------------------
upd. Извините, не заметил, что вам нужна защита от перебора.
А на выходе конвертируйте его в другую систему счисления ([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 раз.
Re: Уникальный id как на YouTube
и насколько он короткий будет? id восьми символов длиной например является подбираемым.
Re: Уникальный id как на YouTube
если на сервере нельзя установить защиту от брутфорса, то конечно тогда надо увеличивать длину.
в моем велосипеде, заменив на md4 и md5
Не желайте странного, и не будет у вас головной боли чтобы достичь этого странного.
Тем более что окажется что оно вам и не нужно было, странное это.
Тем более что окажется что оно вам и не нужно было, странное это.
Re: Уникальный id как на YouTube
ну и возвращаемся к стандарту де-факто - uuid, одного размера с md4/5
Re: Уникальный id как на YouTube
да
но:
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
так дело ж не в битах
-- При полном использовании всех знаков латиницы + все цифры
а в хранении, отображении
то есть надо нагуглить base_convert который использует латинские буквы в двух регистрах.
Encoding like base36 including uppercase
Generating IDs like Youtube or Bit.ly using PHP
Не желайте странного, и не будет у вас головной боли чтобы достичь этого странного.
Тем более что окажется что оно вам и не нужно было, странное это.
Тем более что окажется что оно вам и не нужно было, странное это.
Re: Уникальный id как на YouTube
как не в битах? ты же биты будешь интерпретировать в строку? значит разницы нет между md4/5 и uuid при одинаковом методе интепретации.
не знаю причем здесь base_convert - я про md4/5 vs uuid.
Re: Уникальный id как на YouTube
-- как не в битах?
я предложил лисапед, которым можно играться по длине в битах - от 32ух до сколько нужно-хочется. можно и ripemd320 использовать.
-- не знаю причем здесь base_convert
далее, эти биты, неважно сколько, нужно еще покороче кодировать.
как - тоже подсказал.
и? в чем ваш вопрос?
выбирайте сами, длину и способ кодирования в строку какая вам нужна.
я предложил лисапед, которым можно играться по длине в битах - от 32ух до сколько нужно-хочется. можно и ripemd320 использовать.
-- не знаю причем здесь base_convert
далее, эти биты, неважно сколько, нужно еще покороче кодировать.
как - тоже подсказал.
и? в чем ваш вопрос?
выбирайте сами, длину и способ кодирования в строку какая вам нужна.
Не желайте странного, и не будет у вас головной боли чтобы достичь этого странного.
Тем более что окажется что оно вам и не нужно было, странное это.
Тем более что окажется что оно вам и не нужно было, странное это.