Получение уникального хэша для двух разных строковых URL, которые на самом деле одинаковы - PullRequest
0 голосов
/ 01 апреля 2011

Я индексирую некоторые URL-адреса на основе их хеш-кода и использую этот хеш для их получения.У меня есть 2 вопроса по этому вопросу:

  1. Как вы думаете, это хороший подход?Я имею в виду, что иногда два разных URL-адреса могут создавать один и тот же хеш, но у меня нет другого выбора, поскольку URL-адреса могут быть очень длинными, и мне нужно создать для них имя файла.
  2. [Более важно] Иногдадва разных URL фактически ссылаются на одну и ту же страницу (например, http://www.stackoverflow.com и http://stackoverflow.com, а иногда и URL-адреса с символами%), но мне нужно создать одинаковый хэш-код для этих URL-адресов.Что вы предлагаете?

Спасибо.

Ответы [ 3 ]

2 голосов
/ 01 апреля 2011

Определенно не используйте хеш-код .NET String - нет гарантии, что он будет делать то же самое между версиями (и действительно изменялся между .NET 1.1 и .NET 2.0). У него также вполне могут быть коллизии, и он очень короткий (32 бита).

Если вам действительно нужно использовать хеш, используйте криптографический хеш, так как это менее вероятно, приведет к коллизиям - вы можете, например, использовать SHA-256. Обратите внимание, что крипто-хэши, как правило, работают с точки зрения двоичных данных, поэтому сначала вам нужно преобразовать URL-адрес в байтовый массив, например, с Encoding.UTF8.GetBytes(text). Это не надежно, но, по крайней мере, «очень маловероятно» вызывать столкновения. Конечно, поскольку хеш-код будет больше, ваше имя файла также будет больше. (Я полагаю, вам также потребуется преобразовать из byte[] в строку - я предлагаю вам использовать Convert.ToBase64String).

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

Что касается вашего второго вопроса - в основном вам нужно найти какой-нибудь способ получения канонического URL-адреса из любого заданного URL-адреса, чтобы все «эквивалентные» URL-адреса были преобразованы в один и тот же канонический. и это то, что вы хэшируете или храните.

0 голосов
/ 03 апреля 2011

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

  1. Для меня нет другого пути, кроме использования алгоритма хеширования. Но чтобы уменьшить риск дублирования, я должен использовать лучшие алгоритмы, такие как SHA-2.
  2. Как сказал Мортен Мертнер, в некоторых случаях упомянутые URL-адреса на самом деле НЕ совпадают, и я не могу предположить, что веб-сайт настроен правильно. Единственное, что я могу сделать, - это удалить закладки и использовать экодированную / декодированную версию URL. (Версии с / без символов%).

Спасибо за помощь, ребята.

0 голосов
/ 01 апреля 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...