Menyelidiki Kesipian ValueType.GetHashCode: Nilai Yang Mungkin Tidak Berbeza
Intrik tentang bagaimana pelaksanaan asli ValueType.GetHashCode () mengira kod cincang untuk jenis nilai tidak dapat dinafikan. Mari kita rungkai enigma ini dengan meneliti contoh khusus dan hasil yang tidak dijangka.
Pertimbangkan dua contoh struktur berikut:
struct TheKey { public int id; public string Name; }
Menetapkan nilai yang berbeza pada medan Nama, kami menjangkakan kod cincang mereka untuk berbeza. Walau bagaimanapun, output mendedahkan realiti yang mengejutkan:
var k1 = new TheKey(17, "abc"); var k2 = new TheKey(17, new string(new[] { 'a', 'b', 'c' })); Console.WriteLine("hash1={0}", k1.GetHashCode()); Console.WriteLine("hash2={0}", k2.GetHashCode()); // Output: // hash1=346948941 // hash2=346948941
Walaupun rujukan rentetan berbeza, kedua-dua k1 dan k2 menghasilkan kod cincang yang sama.
Menyingkap Mekanik
Pelaksanaan asli ValueType.GetHashCode() beroperasi melalui mekanisme yang sangat rumit. Terutamanya, ia menentukan sama ada struktur mengandungi rujukan jenis rujukan atau jurang medan. Jika kedua-dua keadaan tidak hadir, ia melaksanakan operasi XOR bitwise yang cekap pada semua bit nilai, dengan berkesan menggabungkan semua medan ke dalam kod cincang. Walau bagaimanapun, pendekatan ini tidak boleh digunakan secara universal.
Apabila jenis rujukan atau jurang wujud, kod tersebut memulakan lintasan medan demi medan, mencari medan yang boleh digunakan—sama ada jenis nilai atau objek bukan nol rujukan. Setelah ditemui, kod cincang medan ini, XOR'ed dengan penunjuk jadual kaedah, membentuk kod cincang akhir.
Misteri Terbongkar
Dalam contoh kami, medan yang boleh digunakan adalah id. Medan rentetan, walaupun nilainya berbeza-beza, diabaikan, menyebabkan kedua-dua k1 dan k2 mempunyai id yang sama dan, akibatnya, kod cincang yang sama.
Kesimpulan
Memahami tingkah laku tidak konvensional ini mengukuhkan kepentingan mencipta jenis nilai dengan teliti untuk pengiraan kod cincang. Adalah penting untuk mengelak daripada bergantung semata-mata pada pelaksanaan lalai CLR. Dengan mentakrifkan pengiraan kod cincang secara eksplisit, pembangun boleh memastikan keunikan dan ketekalan kod cincang untuk jenis nilainya.
Atas ialah kandungan terperinci Mengapakah Keputusan Identical ValueType.GetHashCode() Berlaku untuk Rujukan Rentetan Berbeza Dalam Struktur?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!