Bagikan melalui


Metode System.Runtime.CompilerServices.RuntimeHelpers.GetHashCode

Artikel ini menyediakan keterangan tambahan untuk dokumentasi referensi untuk API ini.

Metode ini RuntimeHelpers.GetHashCode selalu memanggil Object.GetHashCode metode secara non-virtual, bahkan jika jenis objek telah menimpa Object.GetHashCode metode . Oleh karena itu, penggunaan RuntimeHelpers.GetHashCode mungkin berbeda dari panggilan GetHashCode langsung pada objek dengan Object.GetHashCode metode .

Peringatan

RuntimeHelpers.GetHashCode Meskipun metode mengembalikan kode hash yang identik untuk referensi objek yang identik, Anda tidak boleh menggunakan metode ini untuk menguji identitas objek, karena kode hash ini tidak mengidentifikasi referensi objek secara unik. Untuk menguji identitas objek (yaitu, untuk menguji bahwa dua objek mereferensikan objek yang sama dalam memori), panggil Object.ReferenceEquals metode . Anda juga tidak boleh menggunakan GetHashCode untuk menguji apakah dua string mewakili referensi objek yang sama, karena string diinternasi. Untuk menguji interning string, panggil String.IsInterned metode .

Metode Object.GetHashCode dan RuntimeHelpers.GetHashCode berbeda sebagai berikut:

  • Object.GetHashCode mengembalikan kode hash yang didasarkan pada definisi kesetaraan objek. Misalnya, dua string dengan konten yang identik akan mengembalikan nilai yang sama untuk Object.GetHashCode.
  • RuntimeHelpers.GetHashCode mengembalikan kode hash yang menunjukkan identitas objek. Artinya, dua variabel string yang kontennya identik dan mewakili string yang diinternasi (lihat bagian String Interning ) atau yang mewakili string tunggal dalam kode hash identik pengembalian memori.

Penting

Perhatikan bahwa GetHashCode selalu mengembalikan kode hash yang identik untuk referensi objek yang sama. Namun, kebalikannya tidak benar: kode hash yang sama tidak menunjukkan referensi objek yang sama. Nilai kode hash tertentu tidak unik untuk referensi objek tertentu; referensi objek yang berbeda dapat menghasilkan kode hash yang identik.

Metode ini digunakan oleh pengkompilasi.

Interning string

Runtime bahasa umum (CLR) mempertahankan kumpulan string internal dan menyimpan literal di kumpulan. Jika dua string (misalnya, str1 dan str2) terbentuk dari string yang identik harfiah, CLR akan mengatur str1 dan str2 untuk menunjuk ke lokasi yang sama pada tumpukan terkelola untuk menghemat memori. Memanggil RuntimeHelpers.GetHashCode dua objek string ini akan menghasilkan kode hash yang sama, bertentangan dengan item berpoin kedua di bagian sebelumnya.

CLR hanya menambahkan literal ke kumpulan. Hasil operasi string seperti perangkaian tidak ditambahkan ke kumpulan, kecuali kompiler menyelesaikan perangkaian string sebagai string tunggal literal. Oleh karena itu, jika str2 dibuat sebagai hasil dari operasi perangkaian, dan str2 identik dengan str1, menggunakan RuntimeHelpers.GetHashCode pada dua objek string ini tidak akan menghasilkan kode hash yang sama.

Jika Anda ingin menambahkan string yang digabungkan ke kumpulan secara eksplisit, gunakan metode .String.Intern

Anda juga dapat menggunakan String.IsInterned metode untuk memeriksa apakah string memiliki referensi magang.

Contoh

Contoh berikut menunjukkan perbedaan antara Object.GetHashCode metode dan RuntimeHelpers.GetHashCode . Output dari contoh mengilustrasikan hal berikut:

  • Kedua set kode hash untuk serangkaian string pertama yang diteruskan ke ShowHashCodes metode berbeda, karena stringnya benar-benar berbeda.

  • Object.GetHashCode menghasilkan kode hash yang sama untuk kumpulan string kedua yang diteruskan ke ShowHashCodes metode , karena string sama. Namun, metode ini RuntimeHelpers.GetHashCode tidak. String pertama didefinisikan dengan menggunakan string harfiah dan sebagainya diinternasi. Meskipun nilai string kedua sama, string tersebut tidak diinternasi, karena dikembalikan oleh panggilan ke String.Format metode .

  • Dalam kasus string ketiga, kode hash yang diproduksi oleh Object.GetHashCode untuk kedua string identik, seperti halnya kode hash yang diproduksi oleh RuntimeHelpers.GetHashCode. Ini karena pengkompilasi telah memperlakukan nilai yang ditetapkan ke kedua string sebagai string tunggal literal, sehingga variabel string merujuk ke string magang yang sama.

using System;
using System.Runtime.CompilerServices;

public class Example
{
   public static void Main()
   {
      Console.WriteLine("{0,-18} {1,6} {2,18:N0}    {3,6} {4,18:N0}\n",
                        "", "Var 1", "Hash Code", "Var 2", "Hash Code");
      
      // Get hash codes of two different strings.
      String sc1 = "String #1";
      String sc2 = "String #2";
      ShowHashCodes("sc1", sc1, "sc2", sc2);
 
      // Get hash codes of two identical non-interned strings.
      String s1 = "This string";
      String s2 = String.Format("{0} {1}", "This", "string");
      ShowHashCodes("s1", s1, "s2", s2);

      // Get hash codes of two (evidently concatenated) strings.
      String si1 = "This is a string!";
      String si2 = "This " + "is " + "a " + "string!";
      ShowHashCodes("si1", si1, "si2", si2);
   }

   private static void ShowHashCodes(String var1, Object value1, 
                                     String var2, Object value2)
   {
      Console.WriteLine("{0,-18} {1,6} {2,18:X8}    {3,6} {4,18:X8}",
                        "Obj.GetHashCode", var1, value1.GetHashCode(),
                        var2, value2.GetHashCode());

      Console.WriteLine("{0,-18} {1,6} {2,18:X8}    {3,6} {4,18:X8}\n",
                        "RTH.GetHashCode", var1, RuntimeHelpers.GetHashCode(value1),
                        var2, RuntimeHelpers.GetHashCode(value2));
   }
}
// The example displays output similar to the following:
//                        Var 1          Hash Code     Var 2          Hash Code
//    
//    Obj.GetHashCode       sc1           94EABD27       sc2           94EABD24
//    RTH.GetHashCode       sc1           02BF8098       sc2           00BB8560
//    
//    Obj.GetHashCode        s1           29C5A397        s2           29C5A397
//    RTH.GetHashCode        s1           0297B065        s2           03553390
//    
//    Obj.GetHashCode       si1           941BCEA5       si2           941BCEA5
//    RTH.GetHashCode       si1           01FED012       si2           01FED012
Imports System.Runtime.CompilerServices

Module Example
   Public Sub Main()
      Console.WriteLine("{0,-18} {1,6} {2,18:N0}    {3,6} {4,18:N0}",
                        "", "Var 1", "Hash Code", "Var 2", "Hash Code")
      Console.WriteLine()
      
      ' Get hash codes of two different strings.
      Dim sc1 As String = "String #1"
      Dim sc2 As String = "String #2"
      ShowHashCodes("sc1", sc1, "sc2", sc2)
 
      ' Get hash codes of two identical non-interned strings.
      Dim s1 As String = "This string"
      Dim s2 As String = String.Format("{0} {1}", "This", "string")
      ShowHashCodes("s1", s1, "s2", s2)

      ' Get hash codes of two (evidently concatenated) strings.
      Dim si1 As String = "This is a string!"
      Dim si2 As String = "This " + "is " + "a " + "string!"
      ShowHashCodes("si1", si1, "si2", si2)
   End Sub
   
   Private Sub ShowHashCodes(var1 As String, value1 As Object, 
                             var2 As String, value2 As Object)
      Console.WriteLine("{0,-18} {1,6} {2,18:X8}    {3,6} {4,18:X8}",
                        "Obj.GetHashCode", var1, value1.GetHashCode,
                        var2, value2.GetHashCode)

      Console.WriteLine("{0,-18} {1,6} {2,18:X8}    {3,6} {4,18:X8}",
                        "RTH.GetHashCode", var1, RuntimeHelpers.GetHashCode(value1),
                        var2, RuntimeHelpers.GetHashCode(value2))
      Console.WriteLine()
   End Sub
End Module
' The example displays output similar to the following:
'                        Var 1          Hash Code     Var 2          Hash Code
'    
'    Obj.GetHashCode       sc1           94EABD27       sc2           94EABD24
'    RTH.GetHashCode       sc1           02BF8098       sc2           00BB8560
'    
'    Obj.GetHashCode        s1           29C5A397        s2           29C5A397
'    RTH.GetHashCode        s1           0297B065        s2           03553390
'    
'    Obj.GetHashCode       si1           941BCEA5       si2           941BCEA5
'    RTH.GetHashCode       si1           01FED012       si2           01FED012