Когда бы вы использовали длинный строковый идентификатор вместо простого целого числа? [закрыто]

54

Я хотел бы использовать Youtube в качестве примера: они используют идентификаторы в виде PEckzwggd78.

Почему они не используют простые целые числа?

Или imgur.com - они также используют идентификаторы, например, 9b6tMZSдля изображений и галерей. Непоследовательные целые числа.

  • Почему они не используют целые числа (особенно последовательные)?

  • В каких случаях целесообразно использовать такие строковые идентификаторы вместо целых чисел?

Rakori
источник
47
Что заставляет вас верить, что идентификаторы - это не просто целые числа? Я знаю много веб-сервисов, которые используют целые числа в БД, но отображают их в некоторой кодировке base64, поэтому URL выглядят лучше. Интересно, что идентификаторы YouTube почти соответствуют 64-битным целым числам.
Йозеф
2
@rwong Но ОП задают вопрос: почему они не используют числовые идентификаторы, и ответ может быть следующим: они используют числовые идентификаторы, они просто отображают их в base64 вместо base10 или base2. Я не знаю этого точно, поэтому я спрашиваю OP, что конкретно заставляет их думать, что идентификаторы не являются простыми 64-битными целыми числами в base64.
Йозеф
9
youtube.com/watch?v=gocwRvLhDf8
Роджер Липскомб
3
Разве это не так же, как это .
the_lotus

Ответы:

101

Youtube не может использовать последовательные идентификаторы по двум причинам:

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

  2. У него есть опция конфиденциальности "Видео, не включенные в список": те, которые не отображаются в результатах поиска, но доступны, если вы знаете идентификатор.

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

IMIL
источник
11
Числовые идентификаторы не должны быть последовательными
Sopel
28
@Sopel Я думаю, что смысл IMil в том, что Youtube нужно создавать редкие идентификаторы. Другими словами, если предполагается, что вам когда-либо понадобится хранить 2^40элементы, в некоторых архитектурах есть законные причины для выбора пробела 2^80или 2^120битов. Примеры причин: уменьшение столкновения без технической проверки на столкновение; использование разреженности ключей в качестве части затруднения поиска секретов («видео в
списке
13
@Сопел вопрос был: «Почему они не используют целые числа (особенно последовательные)?» Я объясняю, что: 1) последовательные идентификаторы нежелательны; 2) целые числа и строки в основном одно и то же
IMil
3
Предложение «следовательно» логически не следует, но две пронумерованные точки верны. В качестве примера того, почему случайность не является обязательным следствием: последовательная нумерация с одинаковыми пробелами будет работать для предоставления уникальных идентификаторов в нескольких независимых базах данных, так что результаты могут быть объединены в хранилище данных - это форма разделения. То есть предположим, что вы ожидаете не более 10000 региональных баз данных (возможно, у вас сейчас только 10, поэтому достаточно 10000). Тогда у каждого БД может быть столбец идентификаторов, считающий на 10000 уникальные последние 4 цифры, при слиянии не будет столкновений.
Давидбак
2
@davidbak требование случайности следует из (2). Уникальность действительно может быть достигнута путем назначения непересекающихся диапазонов для разных экземпляров базы данных, но это сделает идентификаторы предсказуемыми.
IMil
75
  • В виде идентификаторов: Они используют Base64 ( с помощью символов a- z, A- Z, 0- 9, -и _). Это позволяет им иметь 6 бит информации на символ. YouTube использует 11-символьные идентификаторы видео, то есть они могут генерировать 2 6 * 11 или более 7 * 10 19 идентификаторов. Как сказал Том Скотт , этого «достаточно для каждого человека на планете Земля, чтобы загружать видео каждую минуту в течение примерно 18 000 лет». С Base64 также легко работать, потому что 64 - это степень 2, что означает, что каждый символ представляет точное количество бит. Мы используем шестнадцатеричное (основание 16) по той же причине.

  • О непоследовательной природе идентификаторов: это означает, что им не нужен синхронизированный счетчик между всеми серверами, которые присваивают идентификаторы видео. Они могут просто сгенерировать случайное число, проверить, используется ли оно уже, и перейти оттуда. Они могут даже назначить каждому серверу блок идентификаторов для выбора и устранить проверку на дублирование. Я не знаю, делают ли они это, но они могли.

  • Еще одна причина непоследовательных идентификаторов заключается в том, что именно это заставляет работать «незарегистрированные» видео. Это видео, которые не отображаются в результатах поиска или предложениях, но доступны, если у вас есть ссылка. Если вы используете последовательный подсчет, вы можете просто перейти к видео, увеличить идентификатор на единицу, и идея не включенных в список видео теперь не работает.

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

Я очень рекомендую видео Тома Скотта . Его информация почти всегда интересна и точна.

rchard2scout
источник
6
Также отметим, что 11 символов в кодировке base64 хранят 66 бит информации, что означает, что они могут легко отобразить 64-битное целое число в такую ​​строку. Т.е. внутренне они могли бы использовать 64-битное int в любом случае (но не обязательно).
Бернхард Хиллер
1
Для сравнения, обычное десятичное представление может потребовать до 20 символов, «тратя» до 9 символов по сравнению с Base64.
Ден04
Видео Тома Скотта объясняет это прекрасно.
AGB
13
  • Целые числа не так хорошо масштабируются, «нормальное» 32-разрядное целое число без знака будет превышать чуть более 4 миллиардов.

  • Они могут не захотеть, чтобы вы знали, сколько у них товаров в сети, или отслеживать скорость их роста.

  • Буквы могут содержать больше информации, чем цифры, вам нужно меньше букв, чтобы выразить одно и то же «число». Для большой базы данных индексатора это может сложиться.

Мартин Маат
источник
7
1) можно использовать int 64
Rakori
4
2) почему? ........... в любом случае они все публичные. те, которые не являются публичными - не доступны. вот и все
Ракори
3
3) вы можете уточнить? выразить какую информацию?
Ракори
2
Для 1: то же самое относится к int32 и int64. Хотя int64 потенциально намного больше, он может быть недостаточно большим.
Nepho
3
В базе данных вы будете хранить число как число. Таким образом, 32-битное int займет 32 бита. Текст будет иметь меньшую плотность (насколько более бедный текст будет зависеть от кодировки)
Taemyr
8

1) Почему некоторые сайты используют буквы в своих идентификаторах? Это струны?

Мы не знаем, хранят ли эти сайты идентификаторы в своей базе данных в виде строк. Числа и строки действительно одинаковы для компьютеров. Строка - это просто число, только что показанное с другой базой. 'A' = 0x41 = 65 = 0b1000001к компьютеру все одинаково. Но если вы отобразите его, чем больше база, тем короче представление и короткие URL-адреса, которые будут легче читать и делиться для людей. Сайты, такие как YouTube и Imgur, используют основание 62 (буквы, верхний и нижний регистр, плюс цифры) или больше (добавить тире или другие допустимые символы URL), что относительно мало для больших чисел. Что бы вы предпочли использовать, youtu.be/23489234892348234933или youtu.be/B9k6KMrv8vh?

2) Почему используются непоследовательные идентификаторы?

Ответ IMil хорошо объясняет это:

Youtube не может использовать последовательные идентификаторы по двум причинам:

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

  • У него есть опция конфиденциальности "Видео, не включенные в список": те, которые не отображаются в результатах поиска, но доступны, если вы знаете идентификатор.

Это также объясняет, почему идентификаторы такие большие: (очевидно, на YouTube нет 23 489 234 892 348 234 933 различных видео)

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

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

Jasmijn
источник
3
> «YouTube не принимающие 23.489.234.892.348.234.933 различных видео, очевидно , » Я не уверен , если это очевидно или нет;)
unperson325680
People can just guess the URL of unlisted videos if the chance of any given valid ID being used for a video isn't very, very small.- как вы узнаете, что незарегистрированное видео доступно не всем, кроме его автора? даже если кто-то еще угадал его удостоверение личности
Ракори
2
@progo Я имею в виду, если каждый человек в мире загрузил на YouTube 3,3 миллиарда видео в среднем ...;)
Jasmijn
5

почему не просто целые числа, особенно последовательные? И когда, в каких случаях это разумное решение для такого идентификатора строки вместо целых чисел?

  • Лучший пробел в UTF-8 - когда вы превращаете число в строку, вы получаете не более 10 комбинаций на символ (0-9), но при разрешении любых буквенно-цифровых символов вы получаете 62 комбинации на символ (az, AZ, 0-9) ), поэтому с помощью буквенно-цифровых строк вы можете создать более короткие URL-адреса, чем если бы вы использовали числовые строки. Это важно для сайтов, где пользователи делятся URL - например, Youtube и Imgur.
  • Последовательные целые числа сложнее получить. Чтобы получить последовательное увеличивающееся целое число, вы должны либо создать один поток для создания чисел, либо координировать множество хостов в распределенной системе, а также при запуске приложения большого объема, такого как Youtube или Imgur, которое масштабируется не так хорошо, как случайно сгенерированная строка (чтобы не сказать , что они будут генерироваться случайным образом)

Кроме того, это не обязательно тот случай, когда внутреннее представление является строкой. Скорее всего, они могут кодировать числовой идентификатор в виде буквенно-цифровой строки для более короткого URL.

Самуил
источник
1
2) в случае идентификатора строки, но вам необходимо убедиться, что идентификатор строки был сгенерирован уже перед вставкой новой записи в БД. какая разница с int ID тогда?
Ракори
@Rakorin Даже при использовании чего-то такого простого, как UUIDv4, вероятность столкновения очень мала. Используйте достаточно случайности, и шансов почти не существует, так что двойственность действительно не нуждается в проверке.
Энди
1
@davidpacker и чем это отличается от генерации более длинного целого числа?
Sopel
@Sopel Как указал Самуэль, целые числа занимают больше места, то есть будут длиннее, чем строки. В противном случае, на самом деле нет никакой разницы.
Энди
1
@davidpacker только при печати
SOPEL
2

Как вы уже отметили, что это было бы легко использовать универсальный уникальный идентификатор используя только цифры , потому что под капотом все просто 0и , 1и вы могли бы расширить число , чтобы более точно происходит до 128 бит или более.

Я думаю, что основная причина заключается в том, что, предполагая некоторый произвольный фиксированный диапазон, например uint32(только для примера), если вы используете буквы, у вас может быть в целом более короткий идентификатор.

Я предполагаю, что это эстетическая причина для URL. Вместо того, чтобы 4,129,873,773с буквами, это намного короче Fu837t(просто выдуманный мной). Пользователь может даже запомнить URL-адрес для передачи его другу. Такие платформы, как Youtube, обычно имеют более длинные UUID, чем 32-битные, потому что они быстро исчерпали бы пространство.

Эвальд Б.
источник
3
Я думаю, что это ответ. Использование строк не является ни более эффективным, ни проще поддерживать уникальность. Причина заключается в том, что его легче представить в виде URL
Sopel
если пользователь может запомнить Fu837t, но разве он не может вспомнить 2390?
Ракори
4
@Rakori: Fu837t можно сравнить с 2223955238, так что да. 2390 будет закодирован как «Vg», так что также: да.
Mooing Duck
@ MooingDuck, нет. Как вы узнаете, что такое алгоритм генерации идентификатора строки?
Ракори
3
@Rakori это не алгоритм, это кодировка. Существуют алгоритмы для передачи чисел между различными кодировками, но какой из них используется, не имеет значения, если кодировка четко определена. Url-безопасное кодирование base64 хорошо известно и стандартизировано .
Йозеф
2

Короткий URL желателен, так как он упрощает создание ссылок и обмен (например, вы можете поделиться ссылкой в ​​SMS, быстрее набирать текст и т. Д.). Такие сервисы, как Youtube или Imgurl, хотят, чтобы вы обменивались URL-адресами случайно, поэтому это важное соображение.

Использование буквенно-цифровых идентификаторов вместо числовых означает, что вам нужно меньше символов для выражения идентификатора с одинаковым размером в битах. Например, 6 цифр дают миллион уникальных идентификаторов, а 6 буквенно-цифровых символов (с использованием набора base64) дают 68 миллиардов уникальных идентификаторов.

Насколько нам известно, буквенно-цифровые идентификаторы могут быть последовательными числами, просто закодированными в буквенно-цифровом формате, как base64. Но часто коммерческие службы избегают последовательных кодов, чтобы люди не могли угадать идентификаторы и не раскрывать деловую информацию, например количество клиентов.

JacquesB
источник
1

Есть несколько причин, по которым вы бы использовали нечисловые идентификаторы, но также следует понимать, что не все значения с буквенными символами действительно являются строками. YouTube имеет репутацию невероятного количества видео, порядка 300 часов видео, загружаемых каждую минуту ( ссылка ). Уникальные целые числа, представляющие эти видео, могут быть довольно длинными, поэтому используйте что-то вроде Base64 URL-кодированных чисел ( ссылка )

Типы Идентификационных Представлений:

  • Простые целые числа: (12345, 981027489382493)
  • Base 16 целых чисел: 123456789abcdef - также известный как Hex
  • Base 64 целых числа: 9b6tMZS
  • Читаемые строки: 12032017-Read-my-awesome-article-01

Все они имеют свои сильные и слабые стороны. Чем больше уникальных символов вы можете использовать для своих идентификаторов, тем меньше символов вам понадобится для представления числа. Числа Base 64 являются довольно хорошим компромиссом, поскольку существует установленный вариант, который работает для URL-адресов и сжимает количество символов, необходимое для представления числа от 6 до 8 (т. Е. 3/4 размера).

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

Берин Лорич
источник
1

Содержимое хэшей

Слово «хэш» не встречается в существующих, хороших, ответах, поэтому здесь мы идем:

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

Хэши обычно идут в виде шестнадцатеричных чисел (или даже большего буквенного пространства), поэтому вы не видите целочисленные идентификаторы. Там просто нет ни одного числа (в тех случаях).

Хэши хороши, если ваши объекты данных неизменны (как в ZFS или git); они были бы хороши для хранения изображений, например, на больших CDN. Я не знаю , действительно ли эти конкретные идентификаторы являются хэш, но это, безусловно , имеет смысла (и , как отметил Майкл Kjörling, короткие идентификаторы, вероятно , не хэш по понятным причинам - в качестве сравнения, мерзавец использует значения SHA-1 , которые 20 байт или 40 шестнадцатеричные цифры).

Anoe
источник
1
По крайней мере, идентификаторы видео на YouTube слишком короткие, чтобы быть хешами. Парадокс дня рождения применяется; короче говоря, в среднем, с хэш-пространством из n битов, вы начнете видеть столкновения после просмотра 2 ^ (n / 2) входных BLOB-объектов. С идентификатором ~ 60-70 битов это уникальность 30-35 битов, или несколько миллиардов записей. Я почти уверен, что они размещают больше видео, чем это сейчас. И, конечно же, большинство хэшей просто целые числа; то, что они обычно не печатаются в десятичной форме, не имеет отношения к тому, являются ли они целыми числами. Следует признать, что одни и те же данные , вероятно , можно было бы интерпретировать как с плавающей точкой двоичных данных ...
а CVN
3
@ MichaelKjörling: Идентификаторы видео на YouTube слишком короткие, чтобы быть криптографическими хешами, но есть множество хеш-функций с 64-битным выходом или меньше - CRC-16/32/64, Java hashCode()и т. Д. Конечно, чем короче хэш, более вероятны случайные столкновения.
Ден04
Если бы вы хотели, чтобы люди запомнили URL-адрес, вы бы не указали его значение. И говорить «верхний» или «нижний» перед каждой буквой гораздо менее эффективно, чем просто произносить цифры.
Ленн
0

Хорошо, одна из причин в том, что символы отправляются как символы, а не как целые числа. Это из-за того, как работает HTTP Get.

Когда вы говорите: «Почему бы не использовать целое число?» Ну, тогда целое число нарезается, и каждая цифра отправляется как символ, и вы все равно получите строку символов. Так почему бы не использовать все параметры персонажа?

Существует также человеческий фактор:

Возьмите imgur например: https://imgur.com/ ***** / s6UqP

s6UqP,

Диапазон для каждого символа: заглавные буквы от a до z, заглавные буквы от a до z и от 0 до 9 = 26+ 26+ 10 = 62 параметра для каждой позиции в строке. С пятью позициями это 916132832 возможных комбинаций. Если вы используете только цифры, вам нужно 9 цифр.

Люди могут хранить в памяти примерно 7 объектов, 9 цифр - это слишком много, 5 символов - выполнимо.

Волшебный номер 7

Питер Б
источник
Он помнит Gfycat: они используют три слова, два прилагательных и имя животного. Поскольку существует множество возможностей ( 1502 прилагательных и 1751 животное ), у них более 3 миллиардов комбинаций, использующих только три объекта.
Густаво Родригес