2014-02-10 3 views
6

Будет ли путь.GetRandomFileName генерировать уникальное имя файла каждый раз? Кроме того, как насчет Gettempfilename - будет генерировать уникальное имя?Будет ли путь path.getrandomfilename генерировать уникальное имя файла каждый раз?

+0

Вы столкнетесь со сто миллионов имен файлов. В зависимости от вероятности столкновения, которую вы готовы принять, он может стать неудобным около миллиона имен файлов. – CodesInChaos

+0

Лично я бы использовал 128-битные случайные значения вместо 55 бит. Может не соответствовать 8.3 именам файлов, но DOS довольно мертв, так кого это волнует? – CodesInChaos

+1

GetRandomFileName имеет вторичную мотивацию, которая не связана с энтропией. Несмотря на то, что NTFS поддерживает очень длинные имена путей, большинство версий .NET, кроме последней, ограничены MAX_PATH. Во многих случаях использования необходимо создать несколько уровней рандомизированных папок под созданной в соответствии с окружающей средой папкой TEMP. GetRandomFileName кодирует 50 + бит энтропии в коротком имени, что делает слишком длинную ошибку с ошибкой. Помимо этого, я согласен с тем, что, вероятно, можно следовать той же логике и разработать пользовательскую реализацию, которая использует больше энтропии. – rwong

ответ

4

Короткий ответ - да в обоих случаях.
В действительности получить это приведет к генерации 11 случайных символов, что означает, что есть (26 +10)^11 возможных имен (1.316217e + 17), поэтому шансы на создание одного и того же имени дважды отсутствуют и для всех практических целей.

Для получения дополнительной информации, которую я предлагаю вам прочитать this

и соответствующие MSDNpages

8

В моей системе Path.GetRandomFileName() возвращает короткое имя в формате 8.3.

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

Однако шанс для этого очень низкий, так как Path.GetRandomFileName() использует RNGCryptoServiceProvider, который является криптографически сильным генератором случайных чисел.

Чтобы подвести итог, вы не можете гарантировать строгим образом, что он будет уникальным. Но шанс на дубликат очень низок, поэтому вы можете предположить, что это так.

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