Object.GetHashCode Yöntem

Tanım

Varsayılan karma işlevi olarak işlev görür.Serves as the default hash function.

public:
 virtual int GetHashCode();
public virtual int GetHashCode ();
abstract member GetHashCode : unit -> int
override this.GetHashCode : unit -> int
Public Overridable Function GetHashCode () As Integer

Döndürülenler

Int32

Geçerli nesne için bir karma kod.A hash code for the current object.

Örnekler

Aynı veya daha küçük bir değere sahip sayısal bir değer için bir karma kodu, Int32 türü yalnızca bu değeri döndürmenin en basit yöntemlerinden biridir.One of the simplest ways to compute a hash code for a numeric value that has the same or a smaller range than the Int32 type is to simply return that value. Aşağıdaki örnekte, bir yapı için böyle bir uygulama gösterilmektedir Number .The following example shows such an implementation for a Number structure.

using System;

public struct Number
{
   private int n;

   public Number(int value)
   {
      n = value;
   }

   public int Value
   {
      get { return n; }
   }

   public override bool Equals(Object obj)
   {
      if (obj == null || ! (obj is Number))
         return false;
      else
         return n == ((Number) obj).n;
   }

   public override int GetHashCode()
   {
      return n;
   }

   public override string ToString()
   {
      return n.ToString();
   }
}

public class Example
{
   public static void Main()
   {
      Random rnd = new Random();
      for (int ctr = 0; ctr <= 9; ctr++) {
         int randomN = rnd.Next(Int32.MinValue, Int32.MaxValue);
         Number n = new Number(randomN);
         Console.WriteLine("n = {0,12}, hash code = {1,12}", n, n.GetHashCode());
      }
   }
}
// The example displays output like the following:
//       n =   -634398368, hash code =   -634398368
//       n =   2136747730, hash code =   2136747730
//       n =  -1973417279, hash code =  -1973417279
//       n =   1101478715, hash code =   1101478715
//       n =   2078057429, hash code =   2078057429
//       n =   -334489950, hash code =   -334489950
//       n =    -68958230, hash code =    -68958230
//       n =   -379951485, hash code =   -379951485
//       n =    -31553685, hash code =    -31553685
//       n =   2105429592, hash code =   2105429592
Public Structure Number
   Private n As Integer

   Public Sub New(value As Integer)
      n = value
   End Sub

   Public ReadOnly Property Value As Integer
      Get
         Return n
      End Get
   End Property
   
   Public Overrides Function Equals(obj As Object) As Boolean
      If obj Is Nothing OrElse Not TypeOf obj Is Number Then
         Return False
      Else
         Return n = CType(obj, Number).n
      End If
   End Function      
   
   Public Overrides Function GetHashCode() As Integer
      Return n
   End Function
   
   Public Overrides Function ToString() As String
      Return n.ToString()
   End Function
End Structure

Module Example
   Public Sub Main()
      Dim rnd As New Random()
      For ctr As Integer = 0 To 9
         Dim randomN As Integer = rnd.Next(Int32.MinValue, Int32.MaxValue)
         Dim n As New Number(randomN)
         Console.WriteLine("n = {0,12}, hash code = {1,12}", n, n.GetHashCode())
      Next
   End Sub
End Module
' The example displays output like the following:
'       n =   -634398368, hash code =   -634398368
'       n =   2136747730, hash code =   2136747730
'       n =  -1973417279, hash code =  -1973417279
'       n =   1101478715, hash code =   1101478715
'       n =   2078057429, hash code =   2078057429
'       n =   -334489950, hash code =   -334489950
'       n =    -68958230, hash code =    -68958230
'       n =   -379951485, hash code =   -379951485
'       n =    -31553685, hash code =    -31553685
'       n =   2105429592, hash code =   2105429592

Genellikle, bir türün karma kodu oluşturmaya katılabilen birden fazla veri alanı vardır.Frequently, a type has multiple data fields that can participate in generating the hash code. Karma kod oluşturmanın bir yolu XOR (eXclusive OR) , aşağıdaki örnekte gösterildiği gibi bir işlem kullanarak bu alanları birleştirmesidir.One way to generate a hash code is to combine these fields using an XOR (eXclusive OR) operation, as shown in the following example.

using System;

// A type that represents a 2-D point.
public struct Point
{
    private int x;
    private int y;

    public Point(int x, int y)
    {
       this.x = x;
       this.y = y;
    }

    public override bool Equals(Object obj)
    {
       if (! (obj is Point)) return false;

       Point p = (Point) obj;
       return x == p.x & y == p.y;
    }

    public override int GetHashCode()
    {
        return x ^ y;
    }
}

public class Example
{
   public static void Main()
   {
      Point pt = new Point(5, 8);
      Console.WriteLine(pt.GetHashCode());

      pt = new Point(8, 5);
      Console.WriteLine(pt.GetHashCode());
   }
}
// The example displays the following output:
//       13
//       13
' A type that represents a 2-D point.
Public Structure Point
    Private x As Integer
    Private y As Integer

    Public Sub New(x As Integer, y As Integer)
       Me.x = x
       Me.y = y
    End Sub
    
    Public Overrides Function Equals(obj As Object) As Boolean
       If Not TypeOf obj Is Point Then Return False
       
       Dim p As Point = CType(obj, Point)
       Return x = p.x And y = p.y
    End Function
    
    Public Overrides Function GetHashCode() As Integer 
        Return x Xor y
    End Function 
End Structure 

Public Module Example
   Public Sub Main() 
      Dim pt As New Point(5, 8)
      Console.WriteLine(pt.GetHashCode())
        
      pt = New Point(8, 5)
      Console.WriteLine(pt.GetHashCode())
   End Sub 
End Module

Önceki örnek, (N1, N2) ve (N2, N1) için aynı karma kodu döndürür ve bu nedenle, istenenden daha fazla çarpışmalar oluşturabilir.The previous example returns the same hash code for (n1, n2) and (n2, n1), and so may generate more collisions than are desirable. Bu durumlarda karma kodların aynı olmaması için bir dizi çözüm kullanılabilir.A number of solutions are available so that hash codes in these cases are not identical. Bunlardan biri, Tuple her alanın sırasını yansıtan bir nesnenin karma kodunu döndürmemelidir.One is to return the hash code of a Tuple object that reflects the order of each field. Aşağıdaki örnek, sınıfını kullanan olası bir uygulamayı gösterir Tuple<T1,T2> .The following example shows a possible implementation that uses the Tuple<T1,T2> class. Ancak, bir Tuple nesneyi örneklemesinin performans yükünün, karma tablolarda çok sayıda nesneyi depolayan bir uygulamanın genel performansını önemli ölçüde etkileyebileceğini unutmayın.Note, though, that the performance overhead of instantiating a Tuple object may significantly impact the overall performance of an application that stores large numbers of objects in hash tables.

using System;

public struct Point
{
    private int x;
    private int y;

    public Point(int x, int y)
    {
       this.x = x;
       this.y = y;
    }

    public override bool Equals(Object obj)
    {
        if (obj is Point)
        {
            Point p = (Point) obj;
            return x == p.x & y == p.y;
        }
        else
        {
            return false;
        }      
    }

    public override int GetHashCode()
    {
        return Tuple.Create(x, y).GetHashCode();
    }
}

public class Example
{
   public static void Main()
   {
        Point pt = new Point(5, 8);
        Console.WriteLine(pt.GetHashCode());

        pt = new Point(8, 5);
        Console.WriteLine(pt.GetHashCode());
   }
}
// The example displays the following output:
//       173
//       269
Public Structure Point
    Private x As Integer
    Private y As Integer

    Public Sub New(x As Integer, y As Integer)
       Me.x = x
       Me.y = y
    End Sub
    
    Public Overrides Function Equals(obj As Object) As Boolean
       If Not TypeOf obj Is Point Then Return False
       
       Dim p As Point = CType(obj, Point)
       Return x = p.x And y = p.y
    End Function
    
    Public Overrides Function GetHashCode() As Integer 
        Return Tuple.Create(x, y).GetHashCode()
    End Function 
End Structure 

Public Module Example
    Public Sub Main() 
        Dim pt As New Point(5, 8)
        Console.WriteLine(pt.GetHashCode())
        
        pt = New Point(8, 5)
        Console.WriteLine(pt.GetHashCode())
    End Sub 
End Module         
' The example displays the following output:
'       173
'       269

İkinci bir alternatif çözüm, birbirini izleyen alanların karma kodlarını iki veya daha fazla bit ile sola taşıyarak ayrı karma kodların ağırlığa de içerir.A second alternative solution involves weighting the individual hash codes by left-shifting the hash codes of successive fields by two or more bits. En iyi şekilde, bit 31 ' den daha fazla kaydırılan bitler atılmak yerine sarmalaması gerekir.Optimally, bits shifted beyond bit 31 should wrap around rather than be discarded. Bitleri hem C# hem de Visual Basic sol SHIFT işleçleri tarafından atıldığından, bu, aşağıdaki gibi bir sola kaydırma ve kaydırma yöntemi oluşturulmasını gerektirir:Since bits are discarded by the left-shift operators in both C# and Visual Basic, this requires creating a left shift-and-wrap method like the following:

public int ShiftAndWrap(int value, int positions)
{
    positions = positions & 0x1F;

    // Save the existing bit pattern, but interpret it as an unsigned integer.
    uint number = BitConverter.ToUInt32(BitConverter.GetBytes(value), 0);
    // Preserve the bits to be discarded.
    uint wrapped = number >> (32 - positions);
    // Shift and wrap the discarded bits.
    return BitConverter.ToInt32(BitConverter.GetBytes((number << positions) | wrapped), 0);
}
Public Function ShiftAndWrap(value As Integer, positions As Integer) As Integer
   positions = positions And &h1F
   
   ' Save the existing bit pattern, but interpret it as an unsigned integer.
   Dim number As UInteger = BitConverter.ToUInt32(BitConverter.GetBytes(value), 0)
   ' Preserve the bits to be discarded.
   Dim wrapped AS UInteger = number >> (32 - positions)
   ' Shift and wrap the discarded bits.
   Return BitConverter.ToInt32(BitConverter.GetBytes((number << positions) Or wrapped), 0)
End Function

Aşağıdaki örnek, Point Önceki örneklerde kullanılan yapının karma kodunu hesaplamak için bu Shift ve Wrap yöntemini kullanır.The following example then uses this shift-and-wrap method to compute the hash code of the Point structure used in the previous examples.

using System;

public struct Point
{
    private int x;
    private int y;

    public Point(int x, int y)
    {
       this.x = x;
       this.y = y;
    }

    public override bool Equals(Object obj)
    {
       if (!(obj is Point)) return false;

       Point p = (Point) obj;
       return x == p.x & y == p.y;
    }

    public override int GetHashCode()
    {
        return ShiftAndWrap(x.GetHashCode(), 2) ^ y.GetHashCode();
    }

    private int ShiftAndWrap(int value, int positions)
    {
        positions = positions & 0x1F;

        // Save the existing bit pattern, but interpret it as an unsigned integer.
        uint number = BitConverter.ToUInt32(BitConverter.GetBytes(value), 0);
        // Preserve the bits to be discarded.
        uint wrapped = number >> (32 - positions);
        // Shift and wrap the discarded bits.
        return BitConverter.ToInt32(BitConverter.GetBytes((number << positions) | wrapped), 0);
    }
}

public class Example
{
   public static void Main()
   {
        Point pt = new Point(5, 8);
        Console.WriteLine(pt.GetHashCode());

        pt = new Point(8, 5);
        Console.WriteLine(pt.GetHashCode());
   }
}
// The example displays the following output:
//       28
//       37
Public Structure Point
    Private x As Integer
    Private y As Integer

    Public Sub New(x As Integer, y As Integer)
       Me.x = x
       Me.y = y
    End Sub
    
    Public Overrides Function Equals(obj As Object) As Boolean
       If Not TypeOf obj Is Point Then Return False
       
       Dim p As Point = CType(obj, Point)
       Return x = p.x And y = p.y
    End Function
    
    Public Overrides Function GetHashCode() As Integer 
        Return ShiftAndWrap(x.GetHashCode(), 2) XOr y.GetHashCode()
    End Function 
    
    Private Function ShiftAndWrap(value As Integer, positions As Integer) As Integer
        positions = positions And &h1F
      
        ' Save the existing bit pattern, but interpret it as an unsigned integer.
        Dim number As UInteger = BitConverter.ToUInt32(BitConverter.GetBytes(value), 0)
        ' Preserve the bits to be discarded.
        Dim wrapped AS UInteger = number >> (32 - positions)
        ' Shift and wrap the discarded bits.
        Return BitConverter.ToInt32(BitConverter.GetBytes((number << positions) Or wrapped), 0)
    End Function
End Structure 

Module Example
   Public Sub Main()
        Dim pt As New Point(5, 8)
        Console.WriteLine(pt.GetHashCode())
        
        pt = New Point(8, 5)
        Console.WriteLine(pt.GetHashCode())
   End Sub
End Module
' The example displays the following output:
'       28
'       37

Açıklamalar

Karma kod, sınıf Dictionary<TKey,TValue> , Hashtable sınıf veya sınıftan türetilmiş bir tür gibi karma tabanlı koleksiyondaki bir nesneyi eklemek ve tanımlamak için kullanılan sayısal bir değerdir DictionaryBase .A hash code is a numeric value that is used to insert and identify an object in a hash-based collection such as the Dictionary<TKey,TValue> class, the Hashtable class, or a type derived from the DictionaryBase class. GetHashCodeYöntemi, nesne eşitliğine hızlı denetim gerektiren algoritmalar için bu karma kodu sağlar.The GetHashCode method provides this hash code for algorithms that need quick checks of object equality.

Not

Karma kodlarının karma tablolarda nasıl kullanıldığı hakkında bilgi edinmek ve bazı ek karma kod algoritmaları için, Vikipde karma işlev girişine bakın.For information about how hash codes are used in hash tables and for some additional hash code algorithms, see the Hash Function entry in Wikipedia.

Eşit değer döndüren karma kodları eşit olan iki nesne.Two objects that are equal return hash codes that are equal. Ancak, tersi doğru değildir: farklı (eşit olmayan) nesneler aynı karma kodlara sahip olabileceğinden, eşittir karma kodları nesne eşitliği göstermez.However, the reverse is not true: equal hash codes do not imply object equality, because different (unequal) objects can have identical hash codes. Ayrıca, .NET yönteminin varsayılan uygulamasını garanti etmez GetHashCode ve bu yöntemin döndürdüğü değer, farklı .NET Framework ve .NET Core sürümleri gibi .NET uygulamaları ve 32-bit ve 64 bit platformlar gibi platformlar arasında farklılık gösterebilir.Furthermore, .NET does not guarantee the default implementation of the GetHashCode method, and the value this method returns may differ between .NET implementations, such as different versions of .NET Framework and .NET Core, and platforms, such as 32-bit and 64-bit platforms. Bu nedenlerden dolayı, karma amaçlar için bu yöntemin varsayılan uygulamasını benzersiz bir nesne tanımlayıcısı olarak kullanmayın.For these reasons, do not use the default implementation of this method as a unique object identifier for hashing purposes. İki sonucu bundan sonra izler:Two consequences follow from this:

  • Eşit karma kodlarının nesne eşitlik olduğunu varsaymamalıdır.You should not assume that equal hash codes imply object equality.

  • Aynı nesne uygulama etki alanları, süreçler ve platformlar arasında karma olabileceğinden, bir karma kodu, oluşturulduğu uygulama etki alanının dışında asla kalıcı olarak sürdürmemelidir veya kullanmamalısınız.You should never persist or use a hash code outside the application domain in which it was created, because the same object may hash across application domains, processes, and platforms.

Uyarı

Karma kod, karma tabloya dayalı koleksiyonlarda verimli ekleme ve arama için tasarlanmıştır.A hash code is intended for efficient insertion and lookup in collections that are based on a hash table. Karma kodu kalıcı bir değer değil.A hash code is not a permanent value. Bu nedenle:For this reason:

  • Karma kod değerlerini serileştirmeyin veya veritabanlarında depolamayın.Do not serialize hash code values or store them in databases.
  • Anahtarlı koleksiyondan bir nesne almak için karma kodu anahtar olarak kullanmayın.Do not use the hash code as the key to retrieve an object from a keyed collection.
  • Uygulama etki alanları veya süreçler arasında karma kodları göndermeyin.Do not send hash codes across application domains or processes. Bazı durumlarda, karma kodları işlem başına veya uygulama başına etki alanı temelinde hesaplanabilir.In some cases, hash codes may be computed on a per-process or per-application domain basis.
  • Şifrelenmiş bir karma karmaya ihtiyacınız varsa, şifreleme karma işlevi tarafından döndürülen bir değer yerine karma kodu kullanmayın.Do not use the hash code instead of a value returned by a cryptographic hashing function if you need a cryptographically strong hash. Şifreleme karmaları için veya sınıfından türetilmiş bir sınıf kullanın System.Security.Cryptography.HashAlgorithm System.Security.Cryptography.KeyedHashAlgorithm .For cryptographic hashes, use a class derived from the System.Security.Cryptography.HashAlgorithm or System.Security.Cryptography.KeyedHashAlgorithm class.
  • İki nesnenin eşit olup olmadığını anlamak için karma kodların eşitlik testini test etme.Do not test for equality of hash codes to determine whether two objects are equal. (Eşit olmayan nesneler aynı karma kodlara sahip olabilir.) Eşitlik için test etmek üzere ReferenceEquals veya yöntemini çağırın Equals .(Unequal objects can have identical hash codes.) To test for equality, call the ReferenceEquals or Equals method.

GetHashCodeYöntem türetilmiş bir tür tarafından geçersiz kılınabilir.The GetHashCode method can be overridden by a derived type. Geçersiz GetHashCode kılınmamışsa, başvuru türleri için karma kodları, Object.GetHashCode bir nesnenin başvurusunu temel alan bir karma kodu hesaplayan temel sınıfın metodu çağırarak hesaplanır; daha fazla bilgi için bkz RuntimeHelpers.GetHashCode ..If GetHashCode is not overridden, hash codes for reference types are computed by calling the Object.GetHashCode method of the base class, which computes a hash code based on an object's reference; for more information, see RuntimeHelpers.GetHashCode. Diğer bir deyişle, ReferenceEquals yöntemin döndürdüğü iki nesne true aynı karma kodlarına sahiptir.In other words, two objects for which the ReferenceEquals method returns true have identical hash codes. Değer türleri geçersiz kılınmaz GetHashCode , ValueType.GetHashCode temel sınıfın yöntemi, tür alanlarının değerlerine göre karma kodu hesaplamak için yansıma kullanır.If value types do not override GetHashCode, the ValueType.GetHashCode method of the base class uses reflection to compute the hash code based on the values of the type's fields. Diğer bir deyişle, alanları eşit değerlere sahip olan değer türlerinde eşit karma kodları vardır.In other words, value types whose fields have equal values have equal hash codes. Üzerine yazma hakkında daha fazla bilgi için GetHashCode , "ınherherıtors notları" bölümüne bakın.For more information about overriding GetHashCode, see the "Notes to Inheritors" section.

Uyarı

Yöntemini geçersiz kılarsınız, GetHashCode Ayrıca geçersiz kılmalı Equals ve tam tersi de geçerlidir.If you override the GetHashCode method, you should also override Equals, and vice versa. Geçersiz kılınan Equals yönteminiz true iki nesne eşitlik için test edildiğinde döndürüyorsa, geçersiz kılınan GetHashCode Yöntem iki nesne için aynı değeri döndürmelidir.If your overridden Equals method returns true when two objects are tested for equality, your overridden GetHashCode method must return the same value for the two objects.

Karma tabloda anahtar olarak kullanılan bir nesne yararlı bir uygulama sağlamıyorsa GetHashCode , sınıf oluşturucusunun aşırı yüklerinden birine uygulama sağlayarak bir karma kod sağlayıcısı belirtebilirsiniz IEqualityComparer Hashtable .If an object that is used as a key in a hash table does not provide a useful implementation of GetHashCode, you can specify a hash code provider by supplying an IEqualityComparer implementation to one of the overloads of the Hashtable class constructor.

İçin notlar Windows Çalışma ZamanıWindows RuntimeNotes for the Windows Çalışma ZamanıWindows Runtime

GetHashCodeYöntemi içindeki bir sınıfında çağırdığınızda Windows Çalışma ZamanıWindows Runtime , geçersiz kılınmaz sınıflar için varsayılan davranışı sağlar GetHashCode .When you call the GetHashCode method on a class in the Windows Çalışma ZamanıWindows Runtime, it provides the default behavior for classes that don't override GetHashCode. Bu, .NET Framework için sağladığı desteğin bir parçasıdır Windows Çalışma ZamanıWindows Runtime (bkz. Windows Mağazası uygulamaları Için .NET Framework desteği ve Windows çalışma zamanı).This is part of the support that the .NET Framework provides for the Windows Çalışma ZamanıWindows Runtime (see .NET Framework Support for Windows Store Apps and Windows Runtime). ' Deki sınıflar Windows Çalışma ZamanıWindows Runtime aktarılmaz Object ve şu anda uygulamamamaktadır GetHashCode .Classes in the Windows Çalışma ZamanıWindows Runtime don't inherit Object, and currently don't implement a GetHashCode. Ancak, ToString Equals(Object) GetHashCode bunları C# veya Visual Basic kodunuzda kullanırken,, ve yöntemlerine sahip oldukları gibi görünürler ve .NET Framework bu yöntemler için varsayılan davranışı sağlar.However, they appear to have ToString, Equals(Object), and GetHashCode methods when you use them in your C# or Visual Basic code, and the .NET Framework provides the default behavior for these methods.

Not

Windows Çalışma ZamanıWindows Runtime C# veya Visual Basic yazılmış sınıflar yöntemi geçersiz kılabilir GetHashCode .classes that are written in C# or Visual Basic can override the GetHashCode method.

Devralanlara Notlar

Bir karma işlevi, bir nesnenin değerine karşılık gelen bir sayıyı (karma kodu) hızlıca oluşturmak için kullanılır.A hash function is used to quickly generate a number (hash code) that corresponds to the value of an object. Karma işlevler genellikle her türe özeldir ve benzersizlik için, örnek alanlarından en az birini girdi olarak kullanmalıdır.Hash functions are usually specific to each type and, for uniqueness, must use at least one of the instance fields as input. Karma kodları statik alanların değerleri kullanılarak hesaplanmamalıdır.Hash codes should not be computed by using the values of static fields.

Öğesinden türetilmiş sınıflar için Object , GetHashCode yöntemi GetHashCode() yalnızca türetilmiş sınıf, başvuru eşitliği olacak şekilde eşitliği tanımlıyorsa, temel sınıf uygulamasına temsilci verebilir.For classes derived from Object, the GetHashCode method can delegate to the base class GetHashCode() implementation only if the derived class defines equality to be reference equality. GetHashCode()Başvuru türleri için varsayılan uygulama, yöntemi tarafından döndürülen bir karma kod döndürür GetHashCode(Object) .The default implementation of GetHashCode() for reference types returns a hash code that is equivalent to the one returned by the GetHashCode(Object) method. GetHashCode()Sabit başvuru türleri için geçersiz kılabilirsiniz.You can override GetHashCode() for immutable reference types. Genel olarak, kesilebilir başvuru türleri için yalnızca şu durumlarda geçersiz kılmanız gerekir GetHashCode() :In general, for mutable reference types, you should override GetHashCode() only if: -Karma kodu kesilebilir olmayan alanlardan hesaplama yapabilirsiniz; veya- You can compute the hash code from fields that are not mutable; or -Nesne, karma koduna dayanan bir koleksiyonda yer aldığı sırada kesilebilir nesnenin karma kodunun değişmemesini sağlayabilirsiniz.- You can ensure that the hash code of a mutable object does not change while the object is contained in a collection that relies on its hash code.

Aksi takdirde, kesilebilir nesnenin Karma tabloda kaybolduğunu düşünebilirsiniz.Otherwise, you might think that the mutable object is lost in the hash table. GetHashCode()Kesilebilir bir başvuru türü için geçersiz kılmayı seçerseniz, belgeleriniz, nesne bir karma tabloda depolanırken, kendi yazdığınız kullanıcıların nesne değerlerini değiştirmemelidir.If you do choose to override GetHashCode() for a mutable reference type, your documentation should make it clear that users of your type should not modify object values while the object is stored in a hash table.

Değer türleri için, GetHashCode() yansıma kullanan varsayılan bir karma kod uygulamasını sağlar.For value types, GetHashCode() provides a default hash code implementation that uses reflection. Daha iyi performans için geçersiz kılmayı göz önünde bulundurmanız gerekir.You should consider overriding it for better performance.


Karma kodları çeşitli yollarla hesaplayan daha fazla bilgi ve örnekler için örnekler bölümüne bakın.For more information and examples that compute hash codes in a variety of ways, see the Examples section.

Karma işlevi aşağıdaki özelliklere sahip olmalıdır:A hash function must have the following properties: -İki nesne eşit olarak karşılaştırıldığı GetHashCode() her nesnenin yöntemi aynı değeri döndürmelidir.- If two objects compare as equal, the GetHashCode() method for each object must return the same value. Ancak, iki nesne eşit olarak karşılaştırıalmadığından, GetHashCode() iki nesnenin yöntemlerinin farklı değerler döndürmesi gerekmez.However, if two objects do not compare as equal, the GetHashCode() methods for the two objects do not have to return different values.

-Nesnenin GetHashCode() System. Object. Equals yönteminin dönüş değerini belirleyen nesne durumunda hiçbir değişiklik olmadığı sürece bir nesne için yöntemi sürekli olarak aynı karma kodu döndürmelidir.- The GetHashCode() method for an object must consistently return the same hash code as long as there is no modification to the object state that determines the return value of the object's System.Object.Equals method. Bunun yalnızca uygulamanın geçerli yürütmesi için doğru ve uygulama yeniden çalıştırıldığında farklı bir karma kodun döndürülüp döndürülmeyeceğini unutmayın.Note that this is true only for the current execution of an application, and that a different hash code can be returned if the application is run again.

-En iyi performans için bir karma işlevi, yoğun şekilde kümelenmiş giriş dahil olmak üzere tüm giriş için eşit bir dağıtım üretmelidir.- For the best performance, a hash function should generate an even distribution for all input, including input that is heavily clustered. Nesne durumunda küçük değişiklikler, en iyi karma tablo performansı için ortaya çıkan karma kodda büyük değişikliklere neden olmalıdır.An implication is that small modifications to object state should result in large modifications to the resulting hash code for best hash table performance.

-Karma işlevleri, işlem için ucuzdur.- Hash functions should be inexpensive to compute.

- GetHashCode() Yöntem özel durum oluşturmaz.- The GetHashCode() method should not throw exceptions.

Örneğin, GetHashCode() sınıfı tarafından sunulan yöntemin uygulanması String özdeş dize değerleri için aynı karma kodları döndürür.For example, the implementation of the GetHashCode() method provided by the String class returns identical hash codes for identical string values. Bu nedenle, iki String nesne aynı dize değerini temsil ediyorsa aynı karma kodunu döndürür.Therefore, two String objects return the same hash code if they represent the same string value. Ayrıca, yöntemi, giriş belirli aralıklarda kümelense bile (örneğin, bir dize 65.535 Unicode karakterlerinden herhangi birini içerse de, birçok kullanıcının yalnızca düşük 128 ASCII karakter içeren dizeleri olabilir) için dizedeki tüm karakterleri kullanır.Also, the method uses all the characters in the string to generate reasonably randomly distributed output, even when the input is clustered in certain ranges (for example, many users might have strings that contain only the lower 128 ASCII characters, even though a string can contain any of the 65,535 Unicode characters).

Bir sınıf üzerinde iyi bir karma işlevi sağlamak, bu nesneleri bir karma tabloya eklemenin performansını önemli ölçüde etkileyebilir.Providing a good hash function on a class can significantly affect the performance of adding those objects to a hash table. Karma işlevin iyi bir uygulamasını sağlayan anahtarlar içeren bir karma tabloda, bir öğe araması sabit bir zaman alır (örneğin, bir O (1) işlem).In a hash table with keys that provide a good implementation of a hash function, searching for an element takes constant time (for example, an O(1) operation). Karma bir işlevin düşük bir uygulamasına sahip bir karma tabloda, bir aramanın performansı, karma tablodaki öğelerin sayısına (örneğin, n n karma tablodaki öğelerin sayısı) göre değişir.In a hash table with a poor implementation of a hash function, the performance of a search depends on the number of items in the hash table (for example, an O(n) operation, where n is the number of items in the hash table). Kötü niyetli bir Kullanıcı, aşağıdaki koşullarda karma tablolarına bağlı uygulamaların performansını önemli ölçüde düşürebilen, çarpışmalar sayısını artıran veri girişi yapabilir:A malicious user can input data that increases the number of collisions, which can significantly degrade the performance of applications that depend on hash tables, under the following conditions: -Karma işlevleri sıklıkla çarpışmalar üretir.- When hash functions produce frequent collisions.

-Bir karma tablodaki büyük bir nesne oranı, eşit veya daha yaklaşık bir değere eşit olan karma kodlar üretir.- When a large proportion of objects in a hash table produce hash codes that are equal or approximately equal to one another.

-Kullanıcılar karma kodun hesaplandığı verileri gir,.- When users input the data from which the hash code is computed.

Geçersiz kılan türetilmiş sınıflar GetHashCode() Equals(Object) aynı karma koda eşit kabul edilen iki nesnenin aynı karma koda sahip olduğundan emin olmak için de geçersiz kılınmalıdır; Aksi takdirde Hashtable tür düzgün çalışmayabilir.Derived classes that override GetHashCode() must also override Equals(Object) to guarantee that two objects considered equal have the same hash code; otherwise, the Hashtable type might not work correctly.

Şunlara uygulanır

Ayrıca bkz.