Object.GetHashCode Object.GetHashCode Object.GetHashCode Object.GetHashCode Method

Определение

Служит хэш-функцией по умолчанию.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

Возвраты

Хэш-код для текущего объекта.A hash code for the current object.

Примеры

Один из самых простых способов для вычисления хэш-код для числового значения с той же или меньший диапазон, чем Int32 типа является просто возвращают это значение.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. Пример такой реализации для 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

Как правило тип имеет несколько полей данных, которые могут участвовать в создании хэш-код.Frequently, a type has multiple data fields that can participate in generating the hash code. Один из способов создания хэш-код является объединение этих полей с помощью XOR (eXclusive OR) операции, как показано в следующем примере.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   

Предыдущий пример возвращает одинаковый хэш-код для (n1, n2) и (n2, n1) и поэтому может создавать дополнительные конфликтов, чем предпочтительны.The previous example returns the same hash code for (n1, n2) and (n2, n1), and so may generate more collisions than are desirable. Таким образом, чтобы хэш-кодов в этих случаях не идентичны доступны несколько решений.A number of solutions are available so that hash codes in these cases are not identical. Один — вернуть хэш-код Tuple объект, который совпадает с порядком каждого поля.One is to return the hash code of a Tuple object that reflects the order of each field. В следующем примере показано возможная реализация, которая использует Tuple<T1,T2> класса.The following example shows a possible implementation that uses the Tuple<T1,T2> class. Обратите внимание на то, производительность создания Tuple объекта может значительно повлиять на общую производительность приложения, который хранит большое количество объектов в хэш-таблицы.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)) return false;
       
       Point p = (Point) obj;
       return x == p.x & y == p.y;
    }
    
    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

Второй альтернативное решение включает в себя изменение веса отдельных хэш-коды, сдвиг влево хэш-коды последующих полей двух или более разрядами.A second alternative solution involves weighting the individual hash codes by left-shifting the hash codes of successive fields by two or more bits. Лучше всего вместо уничтожается, биты, сдвигаемые дальше 31 разряд завернуть, а не отменены.Optimally, instead of being discarded, bits shifted beyond bit 31 should wrap around rather than be discarded. Поскольку биты отбрасываются операторами сдвига влево, в C# и Visual Basic, для этого требуется создание левой метода shift и перенос следующим образом: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

В следующем примере затем используется этот метод shift и перенос для вычисления хэш-код Point структура, используемая в предыдущих примерах.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

Комментарии

Хэш-код — это числовое значение, которое используется для вставки и идентификации объекта в коллекции на основе хэша, такие как Dictionary<TKey,TValue> класс, Hashtable класса или типа, производного от 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. GetHashCode Метод предоставляет этот хэш-код для алгоритмов, требующих быстрой проверки на равенство объекта.The GetHashCode method provides this hash code for algorithms that need quick checks of object equality.

Примечание

Сведения об использовании хэш-кодов в хэш-таблицы и некоторые дополнительные хэш-код алгоритмы, см. в разделе хэш-функции запись в Википедии.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.

Два объекта, равно возвращаемого значения хэш-кодов, которые равны.Two objects that are equal return hash codes that are equal. Однако обратное неверно: равно хэш-коды не подразумевают равенство объекта, так как разные объекты (неравных) может иметь одинаковые хэш-кодов.However, the reverse is not true: equal hash codes do not imply object equality, because different (unequal) objects can have identical hash codes. Кроме того, платформа .NET Framework не гарантирует, что реализация по умолчанию GetHashCode метод и значения, этот метод возвращает могут различаться между версиями .NET Framework и платформ, таких как 32-разрядных и 64-разрядных платформах.Furthermore, the .NET Framework does not guarantee the default implementation of the GetHashCode method, and the value this method returns may differ between .NET Framework versions and platforms, such as 32-bit and 64-bit platforms. По этим причинам не используйте реализация по умолчанию этот метод в качестве уникального идентификатора объекта в целях хэширования.For these reasons, do not use the default implementation of this method as a unique object identifier for hashing purposes. Из этого, выполните два последствия.Two consequences follow from this:

  • Не следует предполагать, что равно хэш-коды подразумевают равенство объектов.You should not assume that equal hash codes imply object equality.

  • Никогда не следует сохранять или использовать хэш-код за пределами домена приложения, в котором он был создан, поскольку тот же объект может хэш-между доменами приложений, процессами и платформ.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.

Предупреждение

Хэш-код предназначен для эффективную вставку и поиска в коллекции, основанные на хэш-таблицу.A hash code is intended for efficient insertion and lookup in collections that are based on a hash table. Хэш-код не постоянное значение.A hash code is not a permanent value. По этой причине:For this reason:

  • Не сериализации значения хэш-кода и сохранять их в базах данных.Do not serialize hash code values or store them in databases.
  • Не используйте хэш-код как ключ для извлечения объекта из коллекции с ключом.Do not use the hash code as the key to retrieve an object from a keyed collection.
  • Не отправляли хэш-кодов по доменам приложений и процессов.Do not send hash codes across application domains or processes. В некоторых случаях хэш-коды можно было вычислить на основе домена на уровне процесса или на уровне приложения.In some cases, hash codes may be computed on a per-process or per-application domain basis.
  • Не используйте хэш-код вместо значения, возвращаемого функцией шифрования хэширования, при необходимости криптостойкой хэш.Do not use the hash code instead of a value returned by a cryptographic hashing function if you need a cryptographically strong hash. Для криптографических хэшей, используйте класс, производный от 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.
  • Не выполняйте проверку на предмет равенства хэш-кодов, чтобы определить, равны ли два объекта.Do not test for equality of hash codes to determine whether two objects are equal. (Не эквивалентны объекты могут иметь одинаковые хэш-коды.) Чтобы проверить на предмет равенства, вызовите ReferenceEquals или Equals метод.(Unequal objects can have identical hash codes.) To test for equality, call the ReferenceEquals or Equals method.

GetHashCode Метод может быть переопределен с помощью производного типа.The GetHashCode method can be overridden by a derived type. Если GetHashCode — не выполнено переопределение, хэш-коды для ссылочных типов вычисляются путем вызова Object.GetHashCode на основе методов базового класса, который вычисляет хэш-код, для ссылки на объект; Дополнительные сведения, см. в разделе 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. Другими словами, два объекта, для которого ReferenceEquals возвращает метод true иметь одинаковые хэш-кодов.In other words, two objects for which the ReferenceEquals method returns true have identical hash codes. Если типы значений не переопределяют GetHashCode, ValueType.GetHashCode метод базового класса использует отражение для вычисления хэш-код на основе значений поля типа.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. Другими словами типы значений, поля которых имеют одинаковые значения имеют равно хэш-кодов.In other words, value types whose fields have equal values have equal hash codes. Дополнительные сведения о переопределении GetHashCode, см. в разделе «Примечания для разработчиков производных классов».For more information about overriding GetHashCode, see the "Notes to Inheritors" section.

Предупреждение

При переопределении GetHashCode метод, необходимо также переопределить Equalsи наоборот.If you override the GetHashCode method, you should also override Equals, and vice versa. Если переопределенный Equals возвращает true при двух объектов для проверки на равенство, переопределенный GetHashCode метод должен возвращать одинаковое значение для двух объектов.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.

Если объект, который используется как ключ в хэш-таблице не предоставляет полезную реализацию GetHashCode, поставщиком хэш-кода можно указать, указав 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.

Заметки о Среда выполнения WindowsWindows RuntimeNotes for the Среда выполнения WindowsWindows Runtime

При вызове GetHashCode метод к классу, Среда выполнения WindowsWindows Runtime, он предоставляет поведение по умолчанию для классов, которые не переопределяют GetHashCode.When you call the GetHashCode method on a class in the Среда выполнения WindowsWindows Runtime, it provides the default behavior for classes that don't override GetHashCode. Это является частью возможностей .NET Framework для Среда выполнения WindowsWindows Runtime (см. в разделе приложений .NET Framework поддерживает для Windows Store и среды выполнения Windows).This is part of the support that the .NET Framework provides for the Среда выполнения WindowsWindows Runtime (see .NET Framework Support for Windows Store Apps and Windows Runtime). Классы в Среда выполнения WindowsWindows Runtime не наследуют Objectи в настоящее время не использовать GetHashCode.Classes in the Среда выполнения WindowsWindows Runtime don't inherit Object, and currently don't implement a GetHashCode. Тем не менее, в них могут быть ToString, Equals(Object), и GetHashCode методов при их использовании в коде C# или Visual Basic и .NET Framework предоставляет поведение по умолчанию для этих методов.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.

Примечание

Среда выполнения WindowsWindows Runtime классы, которые создаются на языке C# или Visual Basic можно переопределить GetHashCode метод.classes that are written in C# or Visual Basic can override the GetHashCode method.

Примечания для тех, кто наследует этот метод

Хэш-функции используется для быстрого создания числа (хэш-код), соответствующее значению объекта.A hash function is used to quickly generate a number (hash code) that corresponds to the value of an object. Хэш-функции обычно специфичны для каждого типа и для уникальности, необходимо использовать по крайней мере одно из полей экземпляра как входные данные.Hash functions are usually specific to each type and, for uniqueness, must use at least one of the instance fields as input. Хэш-коды не должно быть вычислено с помощью значения статических полей.Hash codes should not be computed by using the values of static fields.

Для классов, производных от Object, GetHashCode метод можно делегировать базовому классу GetHashCode() реализации только в том случае, если производный класс определяет равенство ссылок.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() для ссылки на типы Возвращает хэш-код, который эквивалентен возвращенного 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() для неизменяемого ссылочных типов.You can override GetHashCode() for immutable reference types. В общем случае для изменяемые ссылочные типы, должны переопределять GetHashCode() только если:In general, for mutable reference types, you should override GetHashCode() only if: — Вы можете вычислить хэш-код из полей, которые не являются изменяемыми; или- You can compute the hash code from fields that are not mutable; or — Убедитесь, что хэш-код из изменяемого объекта не изменяется, пока объект, содержащийся в коллекции, которая зависит от ее хэш-код.- 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.

В противном случае можно подумать, что изменяемый объект теряются в хэш-таблице.Otherwise, you might think that the mutable object is lost in the hash table. Если вы выберете для переопределения GetHashCode() для изменяемый ссылочный тип, к документации по должна обеспечивать что пользователи вашего типа не могут изменять значения объекта во время хранения объекта в хэш-таблице.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.

Для типов значений GetHashCode() предоставляет стандартную реализацию кода хэш, который использует отражение.For value types, GetHashCode() provides a default hash code implementation that uses reflection. Рассмотрите возможность его переопределения для повышения производительности.You should consider overriding it for better performance.

Дополнительные сведения и примеры, которые вычисляют хэш-кодов в различными способами см. в разделе «примеры».For more information and examples that compute hash codes in a variety of ways, see the Examples section.

Хэш-функции должен иметь следующие свойства:A hash function must have the following properties: — Если два объекта считаются равными, GetHashCode() метод для каждого объекта должен возвращать то же значение.- If two objects compare as equal, the GetHashCode() method for each object must return the same value. Тем не менее, если два объекта не сравнении считаются равными, GetHashCode() методов для двух объектов не требуется возвращать разные значения.However, if two objects do not compare as equal, the GetHashCode() methods for the two objects do not have to return different values.

- GetHashCode() Метод для объекта, необходимо постоянно возвращает же хэш-код до тех пор, пока не существует каких-либо изменений в состояние объекта, которое определяет возвращаемое значение объекта System.Object.Equals метод.- 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. Обратите внимание, что это справедливо только для текущего выполнения приложения, и что разные хэш-код могут быть возвращены, если приложение запускается снова.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.

— Для повышения производительности хэш-функции следует создавать равномерное распределение для всех входных данных, включая входные данные, которые сильно кластеризован.- For the best performance, a hash function should generate an even distribution for all input, including input that is heavily clustered. Подразумевается, что небольшие изменения для состояния объекта должно привести к внесении значительных изменений в результирующее хэш-код для достижения оптимальной производительности хэш-таблице.An implication is that small modifications to object state should result in large modifications to the resulting hash code for best hash table performance.

-Хэш функции должны быть недорогих для вычисления.- Hash functions should be inexpensive to compute.

- GetHashCode() Метод не должен вызывать исключения.- The GetHashCode() method should not throw exceptions.

Например, реализация GetHashCode() метод String класс возвращает одинаковые хэш-коды для идентичные строковые значения.For example, the implementation of the GetHashCode() method provided by the String class returns identical hash codes for identical string values. Таким образом, два String объекты возвращают одинаковый хэш-код, если они представляют тот же строковый параметр.Therefore, two String objects return the same hash code if they represent the same string value. Кроме того, этот метод использует все символы в строке для создания случайно распределенного результата, даже в том случае, если входные данные является кластеризованным экземпляром в определенные диапазоны (например, многие пользователи применяют строки, содержащие только первые 128 ASCII, даже если Строка может содержать любой из 65535 символов Юникода).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).

Предоставление хорошей хэш-функции для каждого класса может существенно повлиять на производительность Добавление соответствующих объектов в хэш-таблицу.Providing a good hash function on a class can significantly affect the performance of adding those objects to a hash table. В хэш-таблицы с ключами, которые обеспечивают реализацию хорошей хэш-функции поиск элементов требуется постоянное время (например, операцией o(1)).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). В хэш-таблице при плохой реализации хэш-функции, производительность поиска зависит от числа элементов в хэш-таблицы (например, операцией O (n) операции, где n — количество элементов в хэш-таблице).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). Пользователь-злоумышленник может входные данные, которое увеличивает количество конфликтов, которые может значительно ухудшить производительность приложений, которые зависят от хэш-таблицы, при следующих условиях: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: -Когда хэш-функциям произвести часто конфликтов.- When hash functions produce frequent collisions.

-Когда значительная доля объектов в хэш-таблицу произвести хэш-кодов, которые равны или приблизительно равно друг с другом.- When a large proportion of objects in a hash table produce hash codes that are equal or approximately equal to one another.

— При вводе пользователями данных, из которого вычисляется хэш-код.- When users input the data from which the hash code is computed.

Производные классы, переопределяющие GetHashCode() необходимо также переопределить Equals(Object) гарантировать, что два объекта считаются равными, имеют одинаковый хэш-код; в противном случае Hashtable типа могут работать неправильно.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.

Применяется к

Дополнительно