Схема именования URL-адресов изображений

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

Я намеревался использовать Eucalyptus/Amazon S3 для хранения изображений и задавался вопросом о значении кажущихся случайными имен файлов, используемых такими сайтами, как Tumblr, Twitter и т. д., например.

31.media.tumblr.com/d6ba16060ea4dfd3c67ccf4dbc91df92/tumblr_n164cyLkNl1qkdb42o1_500.jpg

и

pbs.twimg.com/media/Bg7B_kBCMAABYfF.jpg

Как они генерируют эти строки и какие преимущества это дает по сравнению с простым увеличением целого числа для каждого имени файла? Может просто случайные символы? Может быть, хеширование целого числа?

Спасибо!


person Chase Patterson    schedule 20.02.2014    source источник


Ответы (3)


Twitter использует метод кодирования под названием «снежинка». Существует исходник на гитхабе

Базовый формат кодирует метку времени (42 бита), идентификатор центра обработки данных (5 бит) и идентификатор работника (компьютер в центре обработки данных; 5 бит).

Для идентификаторов твитов они записывают значение в виде длинного десятичного числа. Идентификатор твита «508285932617736192» представляет собой шестнадцатеричное значение «070DCB5CDA022000». Первые 42 бита — это метка времени (значение time_t равно 070DCB5C + эпоха, 1291675244). Следующие пять бит — это центр обработки данных (в данном случае «1»), а следующие пять бит — идентификатор рабочего процесса («2»).

Для изображений они делают то же самое, но используют кодировку base64 (в соответствии со стандартом RFC 4648 для кодирования URL; последние два символа base64 — это дефис и подчеркивание).

BwjA8nCCcAAy5zA.jpg расшифровывается как 2014-09-02 20:23:58 GMT, дата-центр №1, рабочий №7

person Al Po    schedule 25.04.2020

Это способ упорядочить медиаданные и гарантировать, что медиаданные не будут перезаписаны, если другой файл имеет такое же имя. Например, если в каталоге pbs.twimg.com/media/ Твиттера есть миллион фотографий и возможно, что две из этих миллионов фотографий имеют имя cat.jpg, Твиттер столкнется с проблемой при загрузке второго файла с тем же именем или запросе файла, где существуют два файла с именем cat.jpg. то же имя. В результате Twitter (среди других приложений) создал способ предотвратить смешение этих двух файлов в базе данных и в результате переименовывает файл после его сжатия в имя файла с гораздо большей специфичностью: набор цифр, букв и символы, которые могут показаться случайными, но генерируются постепенно.

В вашей CMS я предлагаю создать что-то вроде отказоустойчивости, чтобы предотвратить конфликты двух файлов, независимо от того, пытается ли один файл записать поверх другого при загрузке или если он извлекает один файл с тем же именем, что и у другого. Вы можете сделать это несколькими способами. Один из методов, как я только что описал, состоит в том, чтобы переименовать файл и создать систему, которая автоматически увеличивает имена файлов. Не генерируйте эти имена файлов по очевидному шаблону, потому что тогда все медиафайлы будут легко доступны через адресную строку. Это еще одна причина, по которой URL-адреса плохо читаются.

Вы также можете применить функцию file_exists() в своем загрузчике. Это функция PHP, которая проверяет, существует ли уже файл с определенным именем в определенном каталоге. Подробнее об этой функции читайте здесь.

Надеюсь это поможет.

person j0sh1e    schedule 21.02.2014

Мое предположение о схеме именования файлов в tumblr следующее:

  • d6ba16060ea4dfd3c67ccf4dbc91df92 — хэш файла изображения, может быть MD5 или SHA-1.
  • tumblr_n164cyLkNl1qkdb42o1_500.jpg - несколько частей:
  • tumblr_ — очевидный префикс для рекламы сайта
  • n164cyLkNl1qkdb42o — состоит из 2 частей, 10 символов до «1» и 7 после
  • n164cyLkNl — какой-то хеш ID поста, которому принадлежит изображение. Может быть значение пользовательского алфавита Base64
  • qkdb42o — хеш имени блога на tumblr.
  • Затем идет номер, в данном случае '1' - номер изображения в фотосете, если это одна фотография, то просто '1'.
  • Наконец, _500 - максимальная ширина изображения в пикселях.

Источник: я собрал довольно много изображений и тегов из tumblr, и закономерность оказалась очевидной. Вы можете видеть, что способ тегирования одинаков для одного и того же хэша имени блога, в то время как теги сообщений с одинаковым хэшем номера сообщения идентичны на 100%.

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

person Community    schedule 20.04.2015