Как создать уникальный хеш для URL? - PullRequest
14 голосов
/ 27 октября 2009

Учитывая эти два изображения из твиттера.

http://a3.twimg.com/profile_images/130500759/lowres_profilepic.jpg
http://a1.twimg.com/profile_images/58079916/lowres_profilepic.jpg

Я хочу загрузить их в локальную файловую систему и сохранить в одном каталоге. Как мне преодолеть конфликт имен?

В приведенном выше примере я не могу сохранить их как lowres_profilepic.jpg . Моя идея заключается в том, чтобы обрабатывать URL-адреса как непрозрачные строки, за исключением последнего сегмента. Какие алгоритмы (реализованные как f ) можно использовать для хеширования префиксов в уникальные строки.

f( "http://a3.twimg.com/profile_images/130500759/" ) = 6tgjsdjfjdhgf
f( "http://a1.twimg.com/profile_images/58079916/" )  = iuhd87ysdfhdk

Таким образом, я могу сохранить файлы как: -

6tgjsdjfjdhgf_lowres_profilepic.jpg
iuhd87ysdfhdk_lowres_profilepic.jpg

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

Ответы [ 12 ]

0 голосов
/ 12 декабря 2009

Похоже, что числовая часть URL-адресов twimg.com уже является уникальным значением для каждого изображения. Мое исследование показывает, что это число является последовательным (то есть приведенный ниже пример URL для 433 484 366-го изображения профиля, которое когда-либо было загружено - которое, как оказалось, принадлежит мне). Таким образом, этот номер является уникальным. Мое решение состояло бы в том, чтобы просто использовать числовую часть имени файла в качестве «значения хеша», не опасаясь когда-либо найти неуникальное значение.

  • URL: http: //a2.twimg.com/profile_images/433484366/terrorbite-industries-256.png
  • Имя файла: 433484366.terrorbite-industries-256.png
  • Уникальный идентификатор: 433484366

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

P.S. Не имеет значения, с какого субдомена загружается изображение, все изображения доступны со всех поддоменов.

0 голосов
/ 27 октября 2009

Вы сказали:

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

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

Таким образом, вы можете иметь Dictionary<string, string> для работы в качестве кеша для ваших URL. Поэтому, когда вы получаете новый адрес, вы сначала просматриваете этот список и, если не нашли совпадения, хешируете его и сохраняете для будущего использования.

Следуя этой строке, вы можете попробовать MD5:

public static void Main(string[] args)
{
    foreach (string url in new string[]{ 
        "http://a3.twimg.com/profile_images/130500759/lowres_profilepic.jpg", 
        "http://a1.twimg.com/profile_images/58079916/lowres_profilepic.jpg" })
    {
        Console.WriteLine(HashIt(url));
    }
}

private static string HashIt(string url)
{
    Uri path = new Uri(new Uri(url), ".");
    MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
    byte[] data = md5.ComputeHash(
        Encoding.ASCII.GetBytes(path.OriginalString));
    return Convert.ToBase64String(data);
}

Вы получите:

rEoztCAXVyy0AP/6H7w3TQ==
0idVyXLs6sCP/XLBXwtCXA==
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...