Dalam aplikasi kami, kami membuat file Xml dengan atribut yang memiliki nilai Guid. Nilai ini harus konsisten di antara peningkatan file. Jadi, meskipun semua hal lain di file berubah, nilai guid untuk atribut harus tetap sama.
Salah satu solusi yang jelas adalah membuat kamus statis dengan nama file dan Panduan yang akan digunakan untuk kamus tersebut. Kemudian setiap kali kami membuat file, kami mencari nama file di kamus dan menggunakan guid yang sesuai. Tapi ini tidak layak karena kami mungkin menskalakan hingga 100 file dan tidak ingin menyimpan daftar besar panduan.
Jadi pendekatan lain adalah membuat Panduan sama berdasarkan jalur file. Karena jalur file dan struktur direktori aplikasi kami unik, Panduan harus unik untuk jalur itu. Jadi setiap kali kita menjalankan peningkatan, file tersebut mendapatkan panduan yang sama berdasarkan jalurnya. Saya menemukan satu cara keren untuk menghasilkan 'Panduan Penentu ' seperti itu (Terima kasih Elton Stoneman). Ini pada dasarnya melakukan ini:
private Guid GetDeterministicGuid(string input)
{
//use MD5 hash to get a 16-byte hash of the string:
MD5CryptoServiceProvider provider = new MD5CryptoServiceProvider();
byte[] inputBytes = Encoding.Default.GetBytes(input);
byte[] hashBytes = provider.ComputeHash(inputBytes);
//generate a guid from the hash:
Guid hashGuid = new Guid(hashBytes);
return hashGuid;
}
Jadi jika diberi string, Panduannya akan selalu sama.
Apakah ada pendekatan lain atau cara yang direkomendasikan untuk melakukan ini? Apa pro atau kontra dari metode itu?
Ini akan mengubah string apa pun menjadi Guid tanpa harus mengimpor rakitan luar.
Ada cara yang jauh lebih baik untuk menghasilkan Panduan unik, tetapi ini adalah cara untuk meningkatkan data key string ke kunci data Guid secara konsisten.
sumber
Seperti yang disebutkan Rob, metode Anda tidak menghasilkan UUID, metode ini menghasilkan hash yang terlihat seperti UUID.
The RFC 4122 pada UUIDs khusus memungkinkan untuk deterministik (nama-based) UUIDs - Versi 3 dan 5 menggunakan md5 dan SHA1 (masing-masing). Kebanyakan orang mungkin akrab dengan versi 4, yang acak. Wikipedia memberikan gambaran yang bagus tentang versi-versi tersebut. (Perhatikan bahwa penggunaan kata 'versi' di sini sepertinya menggambarkan 'jenis' UUID - versi 5 tidak menggantikan versi 4).
Tampaknya ada beberapa pustaka di luar sana untuk menghasilkan UUID versi 3/5, termasuk modul python uuid , boost.uuid (C ++) dan OSSP UUID . (Saya belum mencari satu pun .net)
sumber
Anda perlu membuat perbedaan antara instance kelas
Guid
, dan pengenal yang unik secara global. Sebuah "pedoman deterministik" sebenarnya adalah hash (sebagaimana dibuktikan dengan panggilan Anda untukprovider.ComputeHash
). Hash memiliki peluang benturan yang jauh lebih tinggi (dua string berbeda terjadi untuk menghasilkan hash yang sama) daripada yang dibuat Guid melaluiGuid.NewGuid
.Jadi masalah dengan pendekatan Anda adalah bahwa Anda harus baik-baik saja dengan kemungkinan bahwa dua jalur yang berbeda akan menghasilkan GUID yang sama. Jika Anda memerlukan pengenal yang unik untuk string jalur tertentu, hal termudah untuk dilakukan adalah menggunakan string tersebut . Jika Anda membutuhkan string untuk dikaburkan dari pengguna Anda, enkripsi - Anda dapat menggunakan ROT13 atau sesuatu yang lebih kuat ...
Mencoba untuk memasukkan sesuatu yang bukan GUID murni ke dalam tipe data GUID dapat menyebabkan masalah pemeliharaan di masa mendatang ...
sumber
MD5 lemah, saya yakin Anda dapat melakukan hal yang sama dengan SHA-1 dan mendapatkan hasil yang lebih baik.
BTW, hanya pendapat pribadi, mendandani hash md5 sebagai GUID tidak menjadikannya GUID yang baik. GUID pada dasarnya adalah non Deterministik. ini terasa seperti curang. Mengapa tidak memanggil sekop sekop dan katakan saja itu string yang diberikan hash dari input. Anda bisa melakukannya dengan menggunakan baris ini, bukan baris pedoman baru:
sumber
Guid
benda?