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


54

Я б хотів використовувати Youtube як приклад: вони використовують ідентифікатори у вигляді PEckzwggd78.

Чому вони не використовують прості цілі числа?

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

  • Чому вони не використовують цілі числа (особливо послідовні)?

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


47
Що змушує вас вважати ідентифікатори не просто простими цілими числами? Я знаю багато веб-сервісів, які використовують цілі числа в БД, але відображають їх у кодування base64, щоб URL-адреси виглядали приємніше. Цікаво, що ідентифікатори youtube майже відображають 64-бітні цілі числа.
Йозеф

2
@rwong Але питання ОП полягає в тому, чому вони не використовують числові ідентифікатори, і відповідь може бути: Вони використовують числові ідентифікатори, вони просто відображають їх у base64 замість base10 або base2. Я точно цього не знаю, тому я запитую ОП, що конкретно змушує їх думати, що ідентифікатори не є простими 64-бітовими цілими числами в base64.
Йосиф


3
Хіба це не так, як це .
the_lotus

Відповіді:


101

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

  1. Його бази даних майже напевно розповсюджуються, що ускладнює послідовну нумерацію.

  2. У ньому є параметр конфіденційності "Відео в списку": ті, які не відображаються в результатах пошуку, але доступні, якщо ви знаєте ідентифікатор.

Тому ідентифікатори відео мають бути досить випадковими та непередбачуваними. Чи ідентифікатор представлений лише цифрами, або комбінацією букв і цифр, не має значення: існує тривіальне відображення від одного подання до іншого.


11
Числові ідентифікатори не повинні бути послідовними
Sopel

28
@Sopel Я думаю, що справа IMil полягає в тому, що Youtube повинен генерувати рідкісні ідентифікатори. Іншими словами, якщо підрахувати, що вам потрібно буде зберігати лише 2^40предмети, в деяких архітектурах є законні причини вибору простору 2^80або 2^120бітів. Прикладами причин є: зменшення зіткнення без технічної перевірки на зіткнення; використання розрідженості клавіш як
складної

13
@Sopel питання було "Чому вони не використовують цілі числа (особливо послідовні)?" Я пояснюю, що: 1) послідовні ідентифікатори небажані; 2) цілі числа та рядки - це одна і та ж річ
IMil

3
Застереження "отже" логічно не випливає, але дві нумеровані точки є правильними. Як приклад того, чому випадковість не є необхідною послідовністю: послідовне нумерація з рівномірними пробілами буде працювати з наданням унікальних ідентифікаторів в декількох незалежних базах даних, щоб результати можна було об'єднати в сховищі даних - це форма посилення. Тобто, припустимо, ви передбачаєте не більше 10000 регіональних баз даних (можливо, зараз у вас всього 10, тому 10000 достатньо). Тоді кожен db може мати стовпчик ідентичності підрахунком до 10000 з унікальними останніми 4 цифрами, зіткнення при злитті не буде.
davidbak

2
@davidbak вимога випадковості випливає з (2). Унікальність дійсно може бути отримана шляхом призначення діапазонів, що не перекриваються, різним екземплярам бази даних, але це дозволить залишити ідентифікатори передбачуваними.
ІМіль

75
  • У вигляді ідентифікаторів: Вони використовують Base64 ( з допомогою символів a- z, A- Z, 0- 9, -і _). Це дозволяє їм мати 6 біт інформації на символ. YouTube використовує 11-символьні ідентифікатори відео, а це означає, що вони можуть генерувати 2 6 * 11 або більше 7 * 10 19 ідентифікаторів. Як сказав Том Скотт , цього "достатньо, щоб кожен чоловік на планеті Земля завантажував відео щохвилини протягом приблизно 18000 років". З Base64 також легко працювати, оскільки 64 - це потужність 2, що означає, що кожен символ представляє точну кількість біт. Ми використовуємо шістнадцятковий (основа 16) з тієї ж причини.

  • Щодо непослідовного характеру ідентифікаторів: це означає, що їм не потрібен синхронізований лічильник між усіма серверами, які присвоюють ідентифікатори відео. Вони можуть просто генерувати випадкове число, перевірити, чи воно вже використовується, і піти звідти. Вони могли навіть призначити кожному серверу блок ідентифікаторів для вибору та усунення перевірки дублювання. Я не знаю, чи роблять вони це, але вони могли.

  • Ще одна причина непослідовних ідентифікаторів - це те, що змушує працювати "незареєстровані" відеоролики. Це відео, які не відображатимуться в результатах пошуку чи як пропозиції, але доступні, якщо у вас є посилання. Якщо ви використовуєте послідовний підрахунок, ви можете просто перейти до відео, збільшити ідентифікатор на одне, і тепер ідея про невідомі відео порушена.

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

Я настійно рекомендую відео Тома Скотта . Його інформація майже завжди одночасно цікава і точна.


6
Зазначимо також, що 11 символів кодування base64 зберігають 66 біт інформації, це означає, що вони можуть легко зіставити 64-бітове ціле число в такий рядок. Тобто всередині, вони все-таки могли використовувати 64-бітний інт (але цього не потрібно робити).
Бернхард Гіллер

1
Для порівняння, звичайне десяткове представлення може зажадати до 20 символів, «витрачаючи» до 9 символів порівняно з Base64.
dan04

Відео Тома Скотта це прекрасно пояснює.
AGB

13
  • Цілі особи не так масштабують, "нормальне" 32-бітове безпідписане ціле число матиме максимум трохи більше 4 мільярдів.

  • Вони, можливо, не хочуть, щоб ви знали, скільки предметів у них є в мережі або відстежують темпи росту.

  • Букви можуть містити більше інформації, ніж цифри, вам потрібно менше літер, щоб виразити те саме "число". Для великої бази даних індексаторів це може скластися.


7
1) можна використовувати int 64
Rakori

4
2) чому? ........... вони все одно публічні. ті, які не є загальнодоступними - недоступні. це все
Ракорі

3
3) чи можете ви детально розробити? висловити яку інформацію?
Ракорі

2
Для 1: те саме стосується int32 та int64. Хоча int64 потенційно набагато більший, він може бути недостатньо великим.
Нефо

3
У базі даних ви б зберігали число як число. Таким чином, 32-бітний інт зайняв би 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-адресою відео, що не входить до списку, якщо шанс будь-якого дійсного ідентифікатора використати для відео не дуже-дуже малий.


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 я маю на увазі, якщо кожна людина в світі завантажила в середньому 3,3 мільярда відео на YouTube ...;)
Jasmijn

5

чому б не просто цілі числа, особливо послідовні? І коли, в яких випадках розумно вирішити такий рядковий ідентифікатор замість цілих чисел?

  • Краще простір UTF-8 - коли ви перетворюєте число в рядок, ви отримуєте максимум 10 комбінацій на символ (0-9), але якщо ви дозволяєте будь-які альфа-цифрові символи, ви отримуєте 62 комбінації на символ (az, AZ, 0-9 ), тож за допомогою буквено-цифрових рядків ви можете створювати короткі URL-адреси, ніж якщо ви використовували числові рядки. Це важливо для сайтів, де користувачі діляться URL-адресами, як-от Youtube та Imgur.
  • Послідовні цілі числа важче отримати. Для створення послідовного зростаючого цілого числа ви повинні мати один потік, який створює числа, або координувати багато хостів у розподіленій системі, і коли ви запускаєте додаток з великим обсягом, наприклад Youtube або Imgur, який не масштабується так добре, як випадково згенерований рядок (щоб не сказати , що вони будуть генеруватися випадковим чином)

Що стосується осторонь, то не обов'язково внутрішнім представленням є рядок. Вони, швидше за все, можуть кодувати числовий ідентифікатор як буквено-цифровий рядок для коротшого URL-адреси.


1
2) у разі ідентифікатора рядка, але вам потрібно буде переконатися, що ідентифікатор рядка створено вже перед тим, як вставити нову запис у db. яка різниця з int ID тоді?
Ракорі

@Rakorin Навіть при використанні чогось такого простого, як UUIDv4, ймовірність виникнення колінісу є мізерною. Використовуйте достатню кількість випадкових випадків і шансів досить не існує, так що дублювання насправді не потрібно перевіряти.
Енді

1
@davidpacker і чим це відрізняється від генерування довшого цілого числа?
Сопель

@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. Але часто комерційні служби уникають послідовних кодів, щоб люди не здогадувались ідентифікатори та уникали розголошення бізнес-інформації, наприклад, кількості клієнтів.


1

Існує кілька причин, чому ви використовуєте нечислові ідентифікатори, але також розумієте, що не всі значення з алфавітними символами насправді є рядками. YouTube має репутацію неймовірної кількості відео, порядку 300 годин завантажуваного відео щохвилини ( посилання ). Унікальні цілі числа, що представляють ці відео, можуть отримувати досить довго, тому використовуйте щось на зразок закодованих чисел URL Base64 ( ref ).

Типи представлень ідентифікаторів:

  • Прості цілі числа: (12345, 981027489382493)
  • Цілі бази 16: 123456789abcdef - також відомий як Hex
  • База 64 цілих чисел: 9b6tMZS
  • Читані рядки: 12032017-Читай-моє-приголомшливо-стаття-01

Усі вони мають свої сильні та слабкі сторони. Чим більше унікальних символів ви можете використовувати для своїх ідентифікаторів, тим менше символів потрібно представити число. Число базових 64 є досить хорошим компромісом, оскільки існує усталений варіант, який працює для URL-адрес і стискає кількість символів, необхідних для представлення числа 6 - 8 (тобто розмір 3/4-й).

Зчитувані рядки працюють для блогів, оскільки вони можуть підвищити можливість пошуку, і набагато простіше створювати унікальні заголовки, коли кількість записів невелика.


1

Зміст хешей

Слово "хеш" не зустрічається в існуючих, приємних, відповідях, тому тут ми переходимо:

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

Хеші зазвичай бувають шістнадцятковими номерами (або ще більшим простором літер), тому ви не бачите цілих ідентифікаторів. Там просто немає жодного числа (в тих випадках).

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


1
Щонайменше ідентифікатори відео Youtube занадто короткі, щоб бути хешами. Застосовується парадокс дня народження; коротше кажучи, в середньому, з хеш-простором з n біт, ви почнете бачити зіткнення, побачивши 2 ^ (n / 2) вхідних краплин. З ~ 60-70 бітами в ідентифікаторі, це 30-35 біт унікальності або кілька мільярдів записів. Я майже впевнений, що вони містять більше відео, ніж це до цього часу. І, звичайно, більшість хешей - це цілі числа просто добре; що вони, як правило, не надруковані у десятковій формі, не стосуються того, чи є цілі числа чи ні. Справді, ті самі дані, ймовірно, можуть бути інтерпретовані як двійкові дані з плаваючою комою ...
CVn

3
@ MichaelKjörling: Ну, ідентифікатори відео YouTube занадто короткі, щоб бути криптографічними хешами, але є багато хеш-функцій, які мають 64 біти або менше - CRC-16/32/64, Java hashCode()тощо. Звичайно, чим коротше хеш, більш вірогідні випадкові зіткнення.
dan04

Якби ви хотіли, щоб люди пам’ятали URL-адресу, ви б не зробили це знаковим регістром. І говорити "верхній" або "нижній" перед кожною буквою набагато менш ефективно, ніж просто вимовляти цифри.
Ленн

0

Однією з причин є те, що символи надсилаються як символи, а не як цілі числа. Це через те, як працює HTTP Get.

Коли ви говорите: "чому б не використовувати ціле число?" Ну, ціле число потім порубається, і кожна цифра надсилається як символ, і ви все одно набираєте рядок символів. То чому б не використати всі параметри для персонажа?

Існує також людський фактор:

Наприклад, imgur: https://imgur.com/ ***** / s6UqP

s6UqP,

Діапазон для кожного символу становить: від a z z капітал, a через z під капітал та від 0 до 9 = 26+ 26+ 10 = 62 варіанти для кожної позиції рядка. З п'ятьма позиціями - це 916132832 можливих комбінацій. Якщо ви використовуєте лише цифри, вам знадобиться 9 цифр.

Люди можуть містити приблизно 7 об’єктів у пам’яті, 9 цифр - це занадто багато, 5 символів можна виконати.

Магічне число 7


Він пам’ятає Gfycat: вони використовують три слова, два прикметники та ім’я тварини. Оскільки є багато можливостей ( 1502 прикметники та 1751 тварина ), вони мають понад 3 мільярди комбінацій, використовуючи лише три об’єкти.
Густаво Родрігес
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.