Rumah > pembangunan bahagian belakang > C++ > Mengapakah Keputusan Identical ValueType.GetHashCode() Berlaku untuk Rujukan Rentetan Berbeza Dalam Struktur?

Mengapakah Keputusan Identical ValueType.GetHashCode() Berlaku untuk Rujukan Rentetan Berbeza Dalam Struktur?

Susan Sarandon
Lepaskan: 2024-12-25 18:29:12
asal
637 orang telah melayarinya

Why Do Identical ValueType.GetHashCode() Results Occur for Different String References Within a Struct?

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;
}
Salin selepas log masuk

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
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan