Определенно не используйте хеш-код .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-адреса были преобразованы в один и тот же канонический. и это то, что вы хэшируете или храните.