Object.GetHashCode Yöntem

Tanım

Varsayılan karma işlevi işlevi görür.

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.

Örnekler

Türünden aynı veya daha küçük bir aralığa sahip sayısal bir değer için karma kodu hesaplamanın en basit yollarından Int32 biri, bu değeri döndürmektir. Aşağıdaki örnekte, bir yapı için böyle bir Number uygulama gösterilmektedir.

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
open System

[<Struct; CustomEquality; NoComparison>]
type Number(value: int) =
    member _.Value = value

    override _.Equals(obj) =
        match obj with
        | :? Number as n ->
            n.Value = value
        | _ -> false

    override _.GetHashCode() =
        value

    override _.ToString() =
        string value

let rnd = Random()
for _ = 0 to 9 do
    let randomN = rnd.Next(Int32.MinValue, Int32.MaxValue)
    let n = Number randomN
    printfn $"n = {n,12}, hash code = {n.GetHashCode(),12}"
// 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

Bir tür genellikle karma kodu oluşturmaya katılabilen birden çok veri alanına sahiptir. Karma kod oluşturmanın bir yolu, aşağıdaki örnekte gösterildiği gibi bu alanları bir XOR (eXclusive OR) işlem kullanarak birleştirmektir.

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.
[<Struct; CustomEquality; NoComparison>]
type Point(x: int, y: int) =
    member _.X = x
    member _.Y = y

    override _.Equals(obj) =
        match obj with
        | :? Point as p ->
            x = p.X && y = p.Y
        | _ -> 
            false

    override _.GetHashCode() =
        x ^^^ y

let pt = Point(5, 8)
printfn $"{pt.GetHashCode()}"

let pt2 = Point(8, 5)
printfn $"{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 çakışma oluşturabilir. Bu gibi durumlarda karma kodların aynı olmaması için bir dizi çözüm kullanılabilir. Bunlardan biri, her alanın sırasını yansıtan bir Tuple nesnenin karma kodunu döndürmektir. Aşağıdaki örnekte sınıfını kullanan olası bir uygulama gösterilmektedir Tuple<T1,T2> . Ancak, bir Tuple nesneyi örneklemenin performans yükünün, karma tablolarda çok sayıda nesne depolayan bir uygulamanın genel performansını önemli ölçüde etkileyeebileceğini unutmayın.

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
[<Struct; CustomEquality; NoComparison>]
type Point(x: int, y: int) =
    member _.X = x
    member _.Y = y

    override _.Equals(obj) =
        match obj with
        | :? Point as p ->
            x = p.X && y = p.Y
        | _ -> 
            false

    override _.GetHashCode() =
        (x, y).GetHashCode()

let pt = Point(5, 8)
printfn $"{pt.GetHashCode()}"

let pt2 = Point(8, 5)
printfn $"{pt2.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, ardışık alanların karma kodlarını iki veya daha fazla bit sola kaydırarak tek tek karma kodların ağırlıklarını belirlemeyi içerir. En uygun şekilde, 31 bitin ötesine kaydırılan bitlerin atılması yerine çevrelenmesi gerekir. Bitler hem C# hem de Visual Basic left-shift işleçleri tarafından atıldığından, bunun için aşağıdaki gibi bir sol kaydırma ve kaydırma yöntemi oluşturulması gerekir:

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);
}
let shiftAndWrap (value: int) positions =
    let positions = positions &&& 0x1F

    // Save the existing bit pattern, but interpret it as an unsigned integer.
    let number = BitConverter.ToUInt32(BitConverter.GetBytes value, 0)
    // Preserve the bits to be discarded.
    let wrapped = number >>> (32 - positions)
    // Shift and wrap the discarded bits.
    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, önceki örneklerde kullanılan yapının karma kodunu Point hesaplamak için bu shift-and-wrap yöntemini kullanır.

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
open System

[<Struct; CustomEquality; NoComparison>]
type Point(x: int, y: int) =
    member _.X = x
    member _.Y = y
    override _.Equals(obj) =
        match obj with
        | :? Point as p ->
            x = p.X && y = p.Y
        | _ -> 
            false

    override this.GetHashCode() =
        this.ShiftAndWrap(x.GetHashCode(), 2) ^^^ y.GetHashCode()

    member _.ShiftAndWrap(value, positions) =
        let positions = positions &&& 0x1F

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

let pt = Point(5, 8)
printfn $"{pt.GetHashCode()}"

let pt2 = Point(8, 5)
printfn $"{pt2.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ı, Hashtable sınıfı veya sınıfından türetilmiş DictionaryBase bir tür gibi Dictionary<TKey,TValue> karma tabanlı bir koleksiyonda nesne eklemek ve tanımlamak için kullanılan sayısal bir değerdir. yöntemi, GetHashCode nesne eşitliğini hızlı bir şekilde denetlemesi gereken algoritmalar için bu karma kodu sağlar.

Not

Karma kodların karma tablolarda nasıl kullanıldığı hakkında bilgi edinmek ve bazı ek karma kod algoritmaları için Wikipedia'daki Karma İşlevi girdisine bakın.

Eşit dönüş karma kodları olan ve eşit olan iki nesne. Ancak, tersi doğru değildir: eşit karma kodları nesne eşitliği anlamına gelmez, çünkü farklı (eşit olmayan) nesneler aynı karma kodlara sahip olabilir. Ayrıca, .NET yöntemin varsayılan uygulamasını GetHashCode garanti etmez ve bu yöntemin döndürdüğü değer, .NET Framework ve .NET Core'un farklı sürümleri gibi .NET uygulamaları ile 32 bit ve 64 bit platformlar gibi platformlar arasında farklılık gösterebilir. Bu nedenlerle, karma amacıyla bu yöntemin varsayılan uygulamasını benzersiz bir nesne tanımlayıcısı olarak kullanmayın. Bunun iki sonucu vardır:

  • Eşit karma kodlarının nesne eşitliği anlamına geldiğini varsaymamalısınız.

  • Aynı nesne uygulama etki alanları, işlemler ve platformlar arasında karma oluşturabileceğinden, karma kodu hiçbir zaman oluşturulduğu uygulama etki alanı dışında kalıcı hale getirin veya kullanmayın.

Uyarı

Karma kod, karma tabloyu temel alan koleksiyonlarda verimli ekleme ve arama için tasarlanmıştır. Karma kod kalıcı bir değer değildir. Bu nedenle:

  • Karma kod değerlerini seri hale getirmeyin veya veritabanlarında depolamayın.
  • Anahtarlanmış koleksiyondan nesne almak için anahtar olarak karma kodu kullanmayın.
  • Karma kodları uygulama etki alanları veya işlemler arasında göndermeyin. Bazı durumlarda karma kodları işlem başına veya uygulama başına etki alanı temelinde hesaplanabilir.
  • Şifreleme açısından güçlü bir karmaya ihtiyacınız varsa, şifreleme karma işlevi tarafından döndürülen bir değer yerine karma kodunu kullanmayın. Şifreleme karmaları için veya System.Security.Cryptography.KeyedHashAlgorithm sınıfından System.Security.Cryptography.HashAlgorithm türetilmiş bir sınıf kullanın.
  • İki nesnenin eşit olup olmadığını belirlemek için karma kodların eşitliğini test etmeyin. (Eşit olmayan nesneler aynı karma kodlara sahip olabilir.) Eşitliği test etmek için veya Equals yöntemini çağırınReferenceEquals.

yöntemi GetHashCode türetilmiş bir tür tarafından geçersiz kılınabilir. GetHashCode Geçersiz kılınmazsa, başvuru türleri için karma kodları, bir nesnenin Object.GetHashCode başvurusuna göre bir karma kodu hesaplayan temel sınıfın yöntemi çağrılarak hesaplanır; daha fazla bilgi için bkzRuntimeHelpers.GetHashCode. . Başka bir deyişle, yönteminin döndürdüğü true iki nesne aynı ReferenceEquals karma kodlara sahiptir. Değer türleri geçersiz kılmazsaGetHashCodeValueType.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. Başka bir deyişle, alanları eşit değerlere sahip değer türleri eşit karma kodlara sahiptir. geçersiz kılma GetHashCodehakkında daha fazla bilgi için "Devralanlara Notlar" bölümüne bakın.

Uyarı

yöntemini geçersiz kılarsanız GetHashCode , öğesini de geçersiz kılmanız Equalsgerekir ve bunun tersi de geçerlidir. Geçersiz kılınan Equals yönteminiz iki nesne eşitlik için test edildiğinde döndürülüyorsa true , geçersiz kılınan GetHashCode yönteminiz iki nesne için aynı değeri döndürmelidir.

Karma tablosunda anahtar olarak kullanılan bir nesne yararlı bir uygulaması sağlamazsa, sınıf oluşturucusunun GetHashCodeaşırı yüklemelerinden Hashtable birine bir uygulama sağlayarak bir IEqualityComparer karma kod sağlayıcısı belirtebilirsiniz.

Windows Çalışma Zamanı notları

yöntemini Windows Çalışma Zamanı bir sınıfta çağırdığınızdaGetHashCode, geçersiz kılmayen GetHashCodesınıflar için varsayılan davranışı sağlar. Bu, .NET Framework Windows Çalışma Zamanı için sağladığı desteğin bir parçasıdır (bkz. Windows Store Uygulamaları ve Windows Çalışma Zamanı için .NET Framework Desteği). Windows Çalışma Zamanı sınıflar devralmaz Objectve şu anda bir GetHashCodeuygulamaz. Ancak, bunları C# veya Visual Basic kodunuzda kullandığınızda , Equals(Object)ve GetHashCode yöntemlerine sahip ToStringgibi görünürler ve .NET Framework bu yöntemler için varsayılan davranışı sağlar.

Not

C# veya Visual Basic yazılmış Windows Çalışma Zamanı sınıfları yöntemini geçersiz kılabilirGetHashCode.

Devralanlara Notlar

Karma işlevi, bir nesnenin değerine karşılık gelen bir sayıyı (karma kodu) hızla oluşturmak için kullanılır. Karma işlevler genellikle her türe özgü olur ve benzersizlik için giriş olarak örnek alanlarından en az birini kullanmalıdır. Karma kodlar statik alanların değerleri kullanılarak hesaplanmamalıdır.

öğesinden ObjectGetHashCode türetilen sınıflar için yöntemi yalnızca türetilen sınıf, başvuru eşitliği olacak şekilde eşitlik tanımladıysa temel sınıf GetHashCode() uygulamasına temsilci atayabilir. Başvuru türleri için varsayılan uygulaması GetHashCode() , yöntemi tarafından GetHashCode(Object) döndürülene eşdeğer bir karma kod döndürür. Sabit başvuru türleri için geçersiz kılabilirsiniz GetHashCode() . Genel olarak, değiştirilebilir başvuru türleri için yalnızca aşağıdaki durumlarda geçersiz kılmalısınız GetHashCode() :

  • Karma kodu değiştirilebilir olmayan alanlardan hesaplayabilirsiniz; Veya
  • Nesne karma kodunu kullanan bir koleksiyonda yer alırken, değiştirilebilir nesnenin karma kodunun değişmediğinden emin olabilirsiniz.

Aksi takdirde, karma tabloda değiştirilebilir nesnenin kaybolduğunu düşünebilirsiniz. Değiştirilebilir başvuru türü için geçersiz kılmayı GetHashCode() seçerseniz, belgeleriniz nesne karma tabloda depolanırken sizin türünüzün kullanıcılarının nesne değerlerini değiştirmemesi gerektiğini açıkça belirtmelidir.

Değer türleri için, GetHashCode() yansıma kullanan bir varsayılan karma kod uygulaması sağlar. Daha iyi performans için geçersiz kılmayı düşünmelisiniz.

Karma kodları çeşitli yollarla hesaplayan daha fazla bilgi ve örnek için Örnekler bölümüne bakın.

Karma işlevi aşağıdaki özelliklere sahip olmalıdır:

  • İki nesne eşit olarak karşılaştırırsa, her nesnenin GetHashCode() yöntemi aynı değeri döndürmelidir. Ancak, iki nesne eşit olarak karşılaştırılmazsa, GetHashCode() iki nesnenin yöntemlerinin farklı değerler döndürmesi gerekmez.

GetHashCode()- Nesnenin System.Object.Equals yönteminin dönüş değerini belirleyen nesne durumunda değişiklik olmadığı sürece, bir nesnenin yöntemi tutarlı olarak aynı karma kodu döndürmelidir. Bunun yalnızca bir uygulamanın geçerli yürütmesi için geçerli olduğunu ve uygulama yeniden çalıştırılırsa farklı bir karma kodun döndürülebileceğini unutmayın.

  • En iyi performans için karma işlevi, yoğun kümelenmiş giriş de dahil olmak üzere tüm girişler için eşit bir dağıtım oluşturmalıdır. Bunun bir etkisi, nesne durumunda yapılan küçük değişikliklerin en iyi karma tablo performansı için sonuçta elde edilen karma kodda büyük değişikliklere neden olmasıdır.

  • Karma işlevlerin işlem için ucuz olması gerekir.

GetHashCode()- yöntemi özel durumlar oluşturmamalıdır.

Örneğin, sınıfı tarafından sağlanan yönteminin GetHashCode() String uygulanması, aynı dize değerleri için aynı karma kodları döndürür. Bu nedenle, aynı dize değerini temsil eden iki String nesne aynı karma kodu döndürür. Ayrıca yöntem, giriş belirli aralıklarda kümelenmiş olsa bile makul bir şekilde rastgele dağıtılmış çıkış oluşturmak için dizedeki tüm karakterleri kullanır (örneğin, bir dize 65.535 Unicode karakterden herhangi birini içerebilse bile, birçok kullanıcının yalnızca daha düşük 128 ASCII karakteri içeren dizeleri olabilir).

Bir sınıfta iyi bir karma işlevi sağlamak, bu nesneleri karma tablosuna ekleme performansını önemli ölçüde etkileyebilir. Karma işlevinin iyi bir uygulamasını sağlayan anahtarlara sahip karma tabloda, bir öğeyi aramak sabit zaman alır (örneğin, O(1) işlemi). Karma işlevinin kötü bir uygulamasına sahip karma tabloda, aramanın performansı karma tablodaki öğelerin sayısına bağlıdır (örneğin, karma tablosundaki öğelerin sayısı olan n bir O(n) işlemi). Kötü amaçlı bir kullanıcı, aşağıdaki koşullar altında karma tablolara bağlı uygulamaların performansını önemli ölçüde düşürebilecek çakışma sayısını artıran veriler giriş yapabilir:

  • Karma işlevler sık sık çarpışmalar oluşturduğunda.

  • Karma tablodaki nesnelerin büyük bir bölümü birbirine eşit veya birbirine yaklaşık olarak eşit karma kodları oluşturduğunda.

  • Kullanıcılar karma kodun hesaplandığı verileri giriş yaparken.

Eşit olarak kabul edilen iki nesnenin aynı karma koduna sahip olmasını garanti etmek için geçersiz kılan GetHashCode() türetilmiş sınıfların da geçersiz kılınması Equals(Object) gerekir; aksi takdirde, Hashtable tür düzgün çalışmayabilir.

Şunlara uygulanır

Ayrıca bkz.