2014-09-08 2 views
0

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

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

string url; 
string uniqueName = UrlToName (url); 
string fileName = path + uniqueName + ".png"; 

Проблема в том, как получить функцию UrlToName. Возможным решением может быть GetHashCode, но я не знаю, правильно ли это.

+0

Каковы правила? Магии нет. То есть, учитывая «привет! Мир» и «helloworld!», Как они должны отображаться на «уникальный ключ»? И какой должен быть соответствующий выход? – user2864740

+3

Base64-encode it (но замените '/' на '-'). – Blorgbeard

+0

@Blorgbeard Возможно, просто соответствующий URI-компонент закодирует его (на сайте использования) в этом случае. – user2864740

ответ

0

попробовать что-то вроде этого:

private string UrlToName(string url) 
{ 
    foreach (char c in System.IO.Path.GetInvalidFileNameChars()) 
    { 
     url = url.Replace(c, '_'); 
    } 
    return url; 
} 

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

Если вам нужно действительно уникальное имя, даже если тот же URL получает прошло, попробуйте это:

private string UrlToName(string url) 
{ 
    url = url + "_" + DateTime.Now.ToString("o"); 
    foreach (char c in System.IO.Path.GetInvalidFileNameChars()) 
    { 
     url = url.Replace(c, '_'); 
    } 
    return url; 
} 

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

+1

Не совсем: например, 'some/url' и' some> url' вернут ту же строку. – Blorgbeard

+0

@Blorgbeard - правда. Однако я бы сказал, что знак «>» также не является допустимым URL-адресом, как отмечено [этим SO-ответом] (http://stackoverflow.com/questions/1547899/which-characters-make-a-url-invalid). Но я только что обновил свой ответ, чтобы сделать его еще более уникальным. – Icemanind

+0

Должно ли ** http: //server/image.jpg** и ** http: //server/image.jpg? A = 1 ** вернуть другую строку, даже если это одно и то же изображение? – thepirat000

2

Лучше всего использовать базу данных - создать новую строку для каждого файла, сохранить Uri в одном столбце и сгенерированное имя файла в другом столбце (например, Guid.NewGuid(). ToString() + ".png «).

Это невосприимчиво к любым проблемам с длиной имени файла (~ 255 символов в NTFS, в то время как URL-адрес может быть ~ 2000), нет шансов на хеш-коллизию, и вы можете развивать алгоритм хранения с течением времени по мере роста базы данных , например, добавление каталогов, так что вы не получите слишком много файлов в одном каталоге (что делает его недействительным в проводнике).

Вы также должны быть обеспокоены проблемами безопасности, если вы когда-либо создавали имена файлов на сервере на основе внешнего ввода. Большая часть рекомендаций в this answer также применяется здесь.

+0

Будет ли файл JSON служить для этой цели? –

+0

Можно использовать любую «базу данных»: простой JSON-файл, который вы читали и записывали, работал бы, но это не очень хорошо при масштабировании или в многопользовательской среде. SQLExpress был бы лучше, или вы могли бы попробовать что-то вроде MongoDB, которое невероятно легко установить, запустить и сериализовать и десериализовать данные в/из. –

+0

Спасибо. Его действительно отслеживать загруженные изображения на мобильном устройстве, поэтому база данных может быть слишком большой для работы. –

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