2014-10-11 2 views
0

У меня 10 миллионов URL-адресов веб-страниц, и я хочу сохранить их HTML как файл. Операционные системы довольно ограничивают то, что я могу использовать в имени моего файла. Я хочу, чтобы какая-то система сопоставляла URL-адреса с алфавитно-цифровыми представлениями для хранения в базе данных ключа-значения с низкой вероятностью создания повторяющихся записей. Мне нужно решение, которое может масштабироваться, и что либо:URL-адреса для преобразования имени файла

  1. Некоторые схемы кодирования (Windows, например, имеет ограничения, как долго имя файла может быть так слишком большие URL-адреса могут производить большие кодированные строки)

  2. Некоторая особенность stdlib, которая имела бы очень малые шансы на создание дубликатов (и карту random_string => url_path в базе данных с ключом).

я придумал следующие решения:

  • Используйте кодирование base64. Это создает большие строки для больших URL-адресов.
  • Используйте Secure Random для генерации urlsafe base64. Я не знаю, сколько комбинаций есть, пока я не получу дубликаты записей.

ответ

1

Я думаю, SHA в шестнадцатеричном представлении является стандартным способом в подобных случаях. Это дает фиксированную длину.

sha = Digest::SHA1.file(file).hexdigest 
+0

Digest :: SHA1.hexdigest 'foo', похоже, для строк. Что делать, если я хочу вернуть это из хэша SHA1 в обычное «foo»? – daremkd

+0

Поскольку вы упомянули Secure Random, я понял, что вам не нужно возвращать исходную строку из преобразованного имени. Если это не так, тогда ваш вопрос вводит в заблуждение или не имеет смысла. – sawa

0

попробовать

md5(base64(filename))  

он должен достаточно уникально :)

+1

Что вы думаете о том, что «base64» приносит на вечеринку? – pguardiario

1

Сохранение на диске будет постоянно растущим списком головных болей. Вместо этого вам нужно использовать что-то лучшее, предназначенное для этой цели; Вы должны сохранить HTML в базе данных. Ваши поисковые запросы будут намного быстрее, и имена не будут иметь никакого значения. Даже SQLite прекрасно справляется с этой задачей.

Вам понадобится поле для фактического URL-адреса, одно для дружественного имени, как правило, название страницы и одно для фактического содержимого HTML.

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

Смежные вопросы