Cara Menghasilkan nama file unik di C #


131

Saya telah menerapkan algoritma yang akan menghasilkan nama unik untuk file yang akan disimpan di hard drive. Saya menambahkan DateTime: Jam, Menit, Detik dan Milidetik, tetapi masih menghasilkan nama file rangkap karena saya mengunggah banyak file sekaligus.

Apa solusi terbaik untuk menghasilkan nama unik untuk file yang akan disimpan pada hard drive sehingga tidak ada 2 file yang sama?


Itu tergantung pada persyaratan lain; pertanyaan [lama] ini terlalu samar.
user2864740

Jawaban:


240

Jika keterbacaan tidak masalah, gunakan GUID .

Misalnya:

var myUniqueFileName = string.Format(@"{0}.txt", Guid.NewGuid());

atau lebih pendek :

var myUniqueFileName = $@"{Guid.NewGuid()}.txt";

Dalam program saya, saya kadang-kadang mencoba misalnya 10 kali untuk menghasilkan nama yang dapat dibaca ("Image1.png" ... "Image10.png") dan jika itu gagal (karena file sudah ada), saya kembali ke GUID.

Memperbarui:

Baru-baru ini, saya juga menggunakan DateTime.Now.Ticksbukannya GUID:

var myUniqueFileName = string.Format(@"{0}.txt", DateTime.Now.Ticks);

atau

var myUniqueFileName = $@"{DateTime.Now.Ticks}.txt";

Manfaatnya bagi saya adalah ini menghasilkan nama file yang lebih pendek dan "lebih bagus", dibandingkan dengan GUID.

Harap dicatat bahwa dalam beberapa kasus (misalnya ketika menghasilkan banyak nama acak dalam waktu yang sangat singkat), ini mungkin membuat nilai-nilai tidak unik.

Tetap berpegang pada GUID jika Anda ingin memastikan bahwa nama file itu unik, bahkan saat mentransfernya ke komputer lain.


7
Saya suka menggunakan Kutu sebagai GUID benar-benar jelek. Anda juga bisa mendapatkan hash dari Kutu yang mengurangi panjang karakter dari nama file. DateTime.Now.Ticks.GetHashCode().ToString("x").ToUpper()
WillMcKill

4
"Kutu" dapat diprediksi dan tidak aman untuk digunakan (karena 'kutu' yang sama dapat diperoleh dari beberapa utas / proses). Ini membuatnya tidak cocok untuk pembuatan nama file temp. Membuat X..1..N mungkin cocok untuk tugas yang dihadapi pengguna (mis. Salin di Explorer), tetapi meragukan untuk pekerjaan server.
user2864740

90

Menggunakan

Path.GetTempFileName()

atau gunakan GUID baru ().

Path.GetTempFilename () di MSDN .


Berikut ini tautan ke dokumen MSDN: msdn.microsoft.com/en-us/library/…
epotter

3
Namun perlu dicatat, itu GetTempFileName()mungkin menimbulkan pengecualian jika Anda membuat banyak file seperti itu tanpa menghapusnya.
Joey

21
"Metode GetTempFileName akan menaikkan IOException jika digunakan untuk membuat lebih dari 65535 file tanpa menghapus file sementara sebelumnya." kata artikel MSDN.
Çağdaş Tekin

1
PERINGATAN: GetTempFileNameakan membuat File. Ini juga berarti bahwa ia memilih lokasi temp temp . Di sisi lain, GetRandomFileNamecocok untuk menghasilkan nama file 8,3 yang dapat digunakan dengan jalur yang berbeda. (Saya telah melihat beberapa kode mengerikan yang menggunakan GetTempFileName dengan File.Delete hanya untuk menggunakan nama file di tempat lain ..)
user2864740


54

Jika keterbacaan nama file tidak penting, maka GUID, seperti yang disarankan oleh banyak orang akan melakukannya. Namun, saya menemukan bahwa melihat ke direktori dengan 1000 nama file GUID sangat menakutkan untuk disortir. Jadi saya biasanya menggunakan kombinasi string statis yang memberikan nama file beberapa informasi konteks, timestamp, dan GUID.

Sebagai contoh:

public string GenerateFileName(string context)
{
    return context + "_" + DateTime.Now.ToString("yyyyMMddHHmmssfff") + "_" + Guid.NewGuid().ToString("N");
}

filename1 = GenerateFileName("MeasurementData");
filename2 = GenerateFileName("Image");

Dengan cara ini, ketika saya mengurutkan berdasarkan nama file, itu akan secara otomatis mengelompokkan file berdasarkan string konteks dan mengurutkan berdasarkan cap waktu.

Perhatikan bahwa batas nama file di windows adalah 255 karakter.


1
+1 Agar saran memasukkan informasi berguna yang dikombinasikan dengan GUID. - Selain mengambil dengan sebutir garam: termasuk tanggal dan waktu dalam nama file agak berlebihan ketika Anda bisa Right Click > Sort By > Date.
Timothy Shields

1
Waktu menjadi berguna jika Anda menyimpan banyak file dengan konteks berbeda di direktori yang sama. Tentu saja, pembuatan nama file harus disesuaikan berdasarkan kebutuhan spesifik Anda.
Mas

Seharusnya Guid.NewGuid().ToString();. Tanda kurung tidak ada. +1 sebaliknya
Laurent W.

Ini sangat apik. Stempel waktu dan Bimbingan. +1
JoshYates1980

Saya suka solusi ini +1, saya menambahkan ekstensi string parameter kedua yang saya tambahkan ke fileName, ini lebih lanjut mendukung gagasan konteks dan memungkinkan untuk dengan mudah membuka file dengan aplikasi default pada klik ganda jika perlu
shelbypereira

23

Berikut adalah algoritme yang mengembalikan nama file unik yang dapat dibaca berdasarkan yang asli. Jika file asli ada, secara bertahap ia akan mencoba menambahkan indeks ke nama file sampai menemukan yang tidak ada. Bunyinya nama file yang ada menjadi HashSet untuk memeriksa tabrakan jadi cukup cepat (beberapa ratus nama file per detik pada mesin saya), aman juga, dan tidak menderita dari kondisi balapan.

Misalnya, jika Anda meneruskannya test.txt, ia akan mencoba membuat file dalam urutan ini:

test.txt
test (2).txt
test (3).txt

dll. Anda dapat menentukan upaya maksimal atau membiarkannya di default.

Ini contoh lengkapnya:

class Program
{
    static FileStream CreateFileWithUniqueName(string folder, string fileName, 
        int maxAttempts = 1024)
    {
        // get filename base and extension
        var fileBase = Path.GetFileNameWithoutExtension(fileName);
        var ext = Path.GetExtension(fileName);
        // build hash set of filenames for performance
        var files = new HashSet<string>(Directory.GetFiles(folder));

        for (var index = 0; index < maxAttempts; index++)
        {
            // first try with the original filename, else try incrementally adding an index
            var name = (index == 0)
                ? fileName
                : String.Format("{0} ({1}){2}", fileBase, index, ext);

            // check if exists
            var fullPath = Path.Combine(folder, name);
            if(files.Contains(fullPath))
                continue;

            // try to create the file
            try
            {
                return new FileStream(fullPath, FileMode.CreateNew, FileAccess.Write);
            }
            catch (DirectoryNotFoundException) { throw; }
            catch (DriveNotFoundException) { throw; }
            catch (IOException) 
            {
                // Will occur if another thread created a file with this 
                // name since we created the HashSet. Ignore this and just
                // try with the next filename.
            } 
        }

        throw new Exception("Could not create unique filename in " + maxAttempts + " attempts");
    }

    static void Main(string[] args)
    {
        for (var i = 0; i < 500; i++)
        {
            using (var stream = CreateFileWithUniqueName(@"c:\temp\", "test.txt"))
            {
                Console.WriteLine("Created \"" + stream.Name + "\"");
            }
        }

        Console.ReadKey();
    }
}

aman ? bukanstatic readonly variabel jugalock?
Kiquenet

Metode itu sendiri statis sehingga tidak berbagi apa pun, jadi saya percaya bahwa banyak utas dapat dengan aman memasukkan metode ini secara bersamaan. Mungkin thread-safe bukan istilah yang benar - Saya mencoba untuk menyampaikan bahwa jika utas / proses lain membuat file dengan nama yang bertentangan selama eksekusi, maka metode ini pulih dan mencoba nama berikutnya yang tersedia. Jangan ragu untuk mengedit jika Anda pikir itu dapat ditingkatkan.
Mike Chamberlain

Mungkin "tidak menderita kondisi ras" adalah cara yang lebih baik untuk menggambarkannya.
Mike Chamberlain

10

Saya menggunakan GetRandomFileName :

Metode GetRandomFileName mengembalikan string acak yang kuat secara kriptografis, yang dapat digunakan sebagai nama folder atau nama file. Tidak seperti GetTempFileName, GetRandomFileName tidak membuat file. Ketika keamanan sistem file Anda adalah yang terpenting, metode ini harus digunakan sebagai ganti GetTempFileName.

Contoh:

public static string GenerateFileName(string extension="")
{
    return string.Concat(Path.GetRandomFileName().Replace(".", ""),
        (!string.IsNullOrEmpty(extension)) ? (extension.StartsWith(".") ? extension : string.Concat(".", extension)) : "");
}

Apakah metode GetRandomFileName () selalu menghasilkan nama file unik setiap kali mirip dengan GUID ()?
Ashish Shukla

1
@ AshishShukla sebenarnya saya tidak tahu. msdn mengatakan "string acak acak yang kuat secara kriptografis" dihasilkan. Sejauh ini saya tidak punya masalah. Jika keunikannya sangat penting, pemeriksaan tambahan mungkin merupakan ide yang bagus.
Koray

3
  1. Buat nama file cap waktu Anda mengikuti proses normal Anda
  2. Periksa untuk melihat apakah nama file ada
  3. Salah - simpan file
  4. Benar - Menambahkan karakter tambahan ke file, mungkin penghitung
  5. Lanjutkan ke langkah 2

10
Algoritma ini dapat digunakan untuk konkurensi
Jader Dias

3

Anda dapat memiliki nama file unik yang dibuat secara otomatis untuk Anda tanpa metode kustom apa pun. Cukup gunakan yang berikut ini dengan Kelas StorageFolder atau Kelas StorageFile . Kuncinya di sini adalah: CreationCollisionOption.GenerateUniqueNamedanNameCollisionOption.GenerateUniqueName

Untuk membuat file baru dengan nama file unik:

var myFile = await ApplicationData.Current.LocalFolder.CreateFileAsync("myfile.txt", NameCollisionOption.GenerateUniqueName);

Untuk menyalin file ke lokasi dengan nama file unik:

var myFile2 = await myFile1.CopyAsync(ApplicationData.Current.LocalFolder, myFile1.Name, NameCollisionOption.GenerateUniqueName);

Untuk memindahkan file dengan nama file unik di lokasi tujuan:

await myFile.MoveAsync(ApplicationData.Current.LocalFolder, myFile.Name, NameCollisionOption.GenerateUniqueName);

Untuk mengganti nama file dengan nama file unik di lokasi tujuan:

await myFile.RenameAsync(myFile.Name, NameCollisionOption.GenerateUniqueName);

2

Saya telah menggunakan kode berikut dan ini berfungsi dengan baik. Saya harap ini dapat membantu Anda.

Saya mulai dengan nama file unik menggunakan cap waktu -

"context_" + DateTime.Now.ToString ("yyyyMMddHHmmssffff")

Kode C # -

public static string CreateUniqueFile(string logFilePath, string logFileName, string fileExt)
    {
        try
        {
            int fileNumber = 1;

            //prefix with . if not already provided
            fileExt = (!fileExt.StartsWith(".")) ? "." + fileExt : fileExt;

            //Generate new name
            while (File.Exists(Path.Combine(logFilePath, logFileName + "-" + fileNumber.ToString() + fileExt)))
                fileNumber++;

            //Create empty file, retry until one is created
            while (!CreateNewLogfile(logFilePath, logFileName + "-" + fileNumber.ToString() + fileExt))
                fileNumber++;

            return logFileName + "-" + fileNumber.ToString() + fileExt;
        }
        catch (Exception)
        {
            throw;
        }
    }

    private static bool CreateNewLogfile(string logFilePath, string logFile)
    {
        try
        {
            FileStream fs = new FileStream(Path.Combine(logFilePath, logFile), FileMode.CreateNew);
            fs.Close();
            return true;
        }
        catch (IOException)   //File exists, can not create new
        {
            return false;
        }
        catch (Exception)     //Exception occured
        {
            throw;
        }
    }

1

Apakah Anda memerlukan cap waktu tanggal dalam nama file?

Anda bisa menjadikan nama file GUID.


@ downvoter Ada alasan untuk pemungutan suara? GUID untuk nama file tampaknya menjadi jawaban populer untuk pertanyaan ini.
Larry Hipp

Itu adalah jawaban yang berulang, dan saya tidak punya cukup reputasi untuk menurunkan suara
Jader Dias

@XMLforDummies jawaban saya adalah yang pertama. Ini mungkin tidak seperti sekarang karena hanya menunjukkan jam sekarang. Itu jawaban yang berulang karena mungkin itu jawaban yang benar.
Larry Hipp


1

Bagaimana kalau menggunakan Guid.NewGuid()untuk membuat GUID dan menggunakannya sebagai nama file (atau bagian dari nama file bersama dengan cap waktu Anda jika Anda suka).


1

Saya telah menulis fungsi rekursif sederhana yang menghasilkan nama file seperti Windows, dengan menambahkan nomor urut sebelum ekstensi file.

Diberikan jalur file yang diinginkan C:\MyDir\MyFile.txt, dan file tersebut sudah ada, ia mengembalikan path file final C:\MyDir\MyFile_1.txt.

Disebut seperti ini:

var desiredPath = @"C:\MyDir\MyFile.txt";
var finalPath = UniqueFileName(desiredPath);

private static string UniqueFileName(string path, int count = 0)
{
    if (count == 0)
    {
        if (!File.Exists(path))
        {
            return path;
        }
    }
    else
    {
        var candidatePath = string.Format(
            @"{0}\{1}_{2}{3}",
            Path.GetDirectoryName(path),
            Path.GetFileNameWithoutExtension(path),
            count,
            Path.GetExtension(path));

        if (!File.Exists(candidatePath))
        {
            return candidatePath;
        }
    }

    count++;
    return UniqueFileName(path, count);
}

Ini bukan thread-safe atau proses-aman. Ada kondisi ras dengan pemeriksaan File.Exists dan setiap (kemudian seharusnya) penciptaan file. Sepele, ketika dipanggil dua kali berturut-turut tanpa membuat file itu akan mengembalikan hasil yang sama.
user2864740

1

Mengapa kami tidak dapat membuat id unik seperti di bawah ini.

Kita dapat menggunakan DateTime.Now.Ticks dan Guid.NewGuid (). ToString () untuk menggabungkan bersama dan membuat id unik.

Saat DateTime.Now.Ticks ditambahkan, kita dapat mengetahui Tanggal dan Waktu dalam detik di mana id unik dibuat.

Silakan lihat kodenya.

var ticks = DateTime.Now.Ticks;
var guid = Guid.NewGuid().ToString();
var uniqueSessionId = ticks.ToString() +'-'+ guid; //guid created by combining ticks and guid

var datetime = new DateTime(ticks);//for checking purpose
var datetimenow = DateTime.Now;    //both these date times are different.

Kami bahkan dapat mengambil bagian dari kutu dalam id unik dan memeriksa tanggal dan waktu kemudian untuk referensi di masa mendatang.

Anda dapat melampirkan id unik yang dibuat untuk nama file atau dapat digunakan untuk membuat id sesi unik untuk login-logout pengguna ke aplikasi atau situs web kami.


Mengapa repot dengan 'ticks' jika ada GUID?
user2864740

Selama skenario apa pun, jika Anda perlu memeriksa kapan uniqueSessionId dihasilkan, Anda akan mendapatkan waktu yang tepat. Dan juga pada saat itu centang spesifik hanya akan muncul sekali seumur hidup.
Jineesh Uvantavida

Sepele, asumsi tentang kutu tidak valid: 1) banyak pengamat dapat melihat 'kutu' yang sama (pikirkan benang / proses) dan 2) 'kutu' yang sama dapat diamati beberapa kali oleh pengamat yang sama, jika ditanya cukup cepat.
user2864740

Namun, dengan hanya menggunakan Guid.NewGuid (dan mengabaikan fakta bahwa itu bukan "acak secara kriptografi" yang mungkin menarik dalam beberapa kasus), kita dapat menyatakan bahwa, dengan probabilitas yang cukup tinggi sehingga kita tidak peduli sebaliknya, ID unik akan dihasilkan - ini adalah jaminan yang jauh lebih tinggi dari 'ticks' . Dengan demikian, 'ticks' tidak memiliki nilai / penggunaan di sini diharapkan sebagai data "sekunder" dimasukkan ke dalam nama file.
user2864740

(FWIW: Saya baru saja memperbaiki beberapa kode dengan pernyataan yang disebutkan di atas tentang 'waktu unik' ..)
user2864740

0

Jika Anda ingin memiliki waktu, jam, menit, dll. Anda dapat menggunakan variabel statis. Tambahkan nilai variabel ini ke nama file. Anda dapat memulai penghitung dengan 0 dan selisih ketika Anda telah membuat file. Dengan cara ini nama file pasti akan unik karena Anda memiliki detik juga dalam file.


0

Saya biasanya melakukan sesuatu seperti ini:

  • mulai dengan nama file batang ( work.dat1misalnya)
  • coba buat dengan CreateNew
  • jika itu berhasil, Anda punya file, jika tidak ...
  • campurkan tanggal / waktu saat ini ke dalam nama file ( work.2011-01-15T112357.datmisalnya)
  • coba buat file
  • jika itu berhasil, Anda punya file, jika tidak ...
  • Campurkan penghitung monoton ke nama file ( work.2011-01-15T112357.0001.datmisalnya. (Saya tidak suka GUID. Saya lebih suka urutan / prediktabilitas.)
  • coba buat file. Terus centang konter dan coba lagi sampai file dibuat untuk Anda.

Berikut kelas contoh:

static class DirectoryInfoHelpers
{
    public static FileStream CreateFileWithUniqueName( this DirectoryInfo dir , string rootName )
    {
        FileStream fs = dir.TryCreateFile( rootName ) ; // try the simple name first

        // if that didn't work, try mixing in the date/time
        if ( fs == null )
        {
            string date = DateTime.Now.ToString( "yyyy-MM-ddTHHmmss" ) ;
            string stem = Path.GetFileNameWithoutExtension(rootName) ;
            string ext  = Path.GetExtension(rootName) ?? ".dat" ;

            ext = ext.Substring(1);

            string fn = string.Format( "{0}.{1}.{2}" , stem , date , ext ) ;
            fs = dir.TryCreateFile( fn ) ;

            // if mixing in the date/time didn't work, try a sequential search
            if ( fs == null )
            {
                int seq = 0 ;
                do
                {
                    fn = string.Format( "{0}.{1}.{2:0000}.{3}" , stem , date , ++seq , ext ) ;
                    fs = dir.TryCreateFile( fn ) ;
                } while ( fs == null ) ;
            }

        }

        return fs ;
    }

    private static FileStream TryCreateFile(this DirectoryInfo dir , string fileName )
    {
        FileStream fs = null ;
        try
        {
            string fqn = Path.Combine( dir.FullName , fileName ) ;

            fs = new FileStream( fqn , FileMode.CreateNew , FileAccess.ReadWrite , FileShare.None ) ;
        }
        catch ( Exception )
        {
            fs = null ;
        }
        return fs ;
    }

}

Anda mungkin ingin mengubah algoritma (selalu menggunakan semua komponen yang mungkin untuk nama file misalnya). Tergantung pada konteksnya - Jika saya membuat file log misalnya, yang mungkin ingin saya putar tidak ada, Anda ingin mereka semua membagikan pola yang sama dengan namanya.

Kode tidak sempurna (tidak ada pemeriksaan pada data yang dikirimkan misalnya). Dan algoritmanya tidak sempurna (jika Anda mengisi hard drive atau mendapatkan izin, kesalahan I / O aktual atau kesalahan sistem file lainnya, misalnya, ini akan menggantung, seperti berdiri, dalam loop tak terbatas).


0

Saya akhirnya menggabungkan GUID dengan string Hari Hari Tahun Milidetik Kedua dan saya pikir solusi ini cukup baik dalam skenario saya



0

Saya menulis kelas khusus untuk melakukan ini. Ini diinisialisasi dengan bagian "basis" (default ke stempel waktu akurat-menit) dan setelah itu menambahkan huruf untuk membuat nama-nama unik. Jadi, jika cap pertama yang dihasilkan adalah 1907101215a, yang kedua adalah 1907101215b, maka 1907101215c, dan lain-lain.

Jika saya membutuhkan lebih dari 25 perangko unik maka saya menggunakan unary 'z's untuk menghitung 25's. Jadi, begini 1907101215y, 1907101215za, 1907101215zb, ... 1907101215zy, 1907101215zza, 1907101215zzb, dan sebagainya. Ini menjamin bahwa prangko akan selalu disortir secara alfanumerik sesuai urutan pembuatannya (selama karakter berikutnya setelah cap bukan surat).

Ini bukan thread-safe, tidak secara otomatis memperbarui waktu, dan cepat menggembung jika Anda membutuhkan ratusan prangko, tetapi saya merasa cukup untuk kebutuhan saya.

/// <summary>
/// Class for generating unique stamps (for filenames, etc.)
/// </summary>
/// <remarks>
/// Each time ToString() is called, a unique stamp is generated.
/// Stamps are guaranteed to sort alphanumerically in order of generation.
/// </remarks>
public class StampGenerator
{
  /// <summary>
  /// All the characters which could be the last character in the stamp.
  /// </summary>
  private static readonly char[] _trailingChars =
  {
    'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j',
    'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't',
    'u', 'v', 'w', 'x', 'y'
  };

  /// <summary>
  /// How many valid trailing characters there are.
  /// </summary>
  /// <remarks>Should always equal _trailingChars.Length</remarks>
  public const int TRAILING_RANGE = 25;

  /// <summary>
  /// Maximum length of the stamp. Hard-coded for laziness.
  /// </summary>
  public const int MAX_LENGTH_STAMP = 28;

  /// <summary>
  /// Base portion of the stamp. Will be constant between calls.
  /// </summary>
  /// <remarks>
  /// This is intended to uniquely distinguish between instances.
  /// Default behavior is to generate a minute-accurate timestamp.
  /// </remarks>
  public string StampBase { get; }

  /// <summary>
  /// Number of times this instance has been called.
  /// </summary>
  public int CalledTimes { get; private set; }

  /// <summary>
  /// Maximum number of stamps that can be generated with a given base.
  /// </summary>
  public int MaxCalls { get; }

  /// <summary>
  /// Number of stamps remaining for this instance.
  /// </summary>
  public int RemainingCalls { get { return MaxCalls - CalledTimes; } }

  /// <summary>
  /// Instantiate a StampGenerator with a specific base.
  /// </summary>
  /// <param name="stampBase">Base of stamp.</param>
  /// <param name="calledTimes">
  /// Number of times this base has already been used.
  /// </param>
  public StampGenerator(string stampBase, int calledTimes = 0)
  {
    if (stampBase == null)
    {
      throw new ArgumentNullException("stampBase");
    }
    else if (Regex.IsMatch(stampBase, "[^a-zA-Z_0-9 \\-]"))
    {
      throw new ArgumentException("Invalid characters in Stamp Base.",
                                  "stampBase");
    }
    else if (stampBase.Length >= MAX_LENGTH_STAMP - 1)
    {
      throw new ArgumentException(
        string.Format("Stamp Base too long. (Length {0} out of {1})",
                      stampBase.Length, MAX_LENGTH_STAMP - 1), "stampBase");
    }
    else if (calledTimes < 0)
    {
      throw new ArgumentOutOfRangeException(
        "calledTimes", calledTimes, "calledTimes cannot be negative.");
    }
    else
    {
      int maxCalls = TRAILING_RANGE * (MAX_LENGTH_STAMP - stampBase.Length);
      if (calledTimes >= maxCalls)
      {
        throw new ArgumentOutOfRangeException(
          "calledTimes", calledTimes, string.Format(
            "Called Times too large; max for stem of length {0} is {1}.",
            stampBase.Length, maxCalls));
      }
      else
      {
        StampBase = stampBase;
        CalledTimes = calledTimes;
        MaxCalls = maxCalls;
      }
    }
  }

  /// <summary>
  /// Instantiate a StampGenerator with default base string based on time.
  /// </summary>
  public StampGenerator() : this(DateTime.Now.ToString("yMMddHHmm")) { }

  /// <summary>
  /// Generate a unique stamp.
  /// </summary>
  /// <remarks>
  /// Stamp values are orered like this:
  /// a, b, ... x, y, za, zb, ... zx, zy, zza, zzb, ...
  /// </remarks>
  /// <returns>A unique stamp.</returns>
  public override string ToString()
  {
    int zCount = CalledTimes / TRAILING_RANGE;
    int trailing = CalledTimes % TRAILING_RANGE;
    int length = StampBase.Length + zCount + 1;

    if (length > MAX_LENGTH_STAMP)
    {
      throw new InvalidOperationException(
        "Stamp length overflown! Cannot generate new stamps.");
    }
    else
    {
      CalledTimes = CalledTimes + 1;
      var builder = new StringBuilder(StampBase, length);
      builder.Append('z', zCount);
      builder.Append(_trailingChars[trailing]);
      return builder.ToString();
    }
  }
}

-1

DateTime.Now.Tickstidak aman, Guid.NewGuid()terlalu jelek, jika Anda membutuhkan sesuatu yang bersih dan hampir aman ( tidak 100% aman misalnya jika Anda menyebutnya 1.000.000 kali dalam 1 ms ), coba:

Math.Abs(Guid.NewGuid().GetHashCode())

Dengan aman saya maksudkan aman untuk menjadi unik ketika Anda menyebutnya berkali-kali dalam periode yang sangat singkat beberapa ms waktu.


Apakah ada masalah dengan solusi saya downvoter? tolong beritahu saya.
Mehdi Dehghani

The GetHashCodeMetode mengembalikan sebuah int, yang memiliki jangkauan 32-bit, sedangkan GUIDmemiliki jangkauan 128-bit, dan jauh lebih mungkin untuk menjadi unik. Jika Anda tidak menyukai format GUIDnilai, cukup panggil ToString("N")saja, yang menghilangkan tanda hubung.
4thex
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.