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, для этого требуется создать метод сдвига влево, как в следующем примере: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

В следующем примере используется этот метод сдвига и переноса для вычисления хэш-кода 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 не гарантирует реализацию GetHashCode метода по умолчанию, и значение, возвращаемое этим методом, может отличаться между реализациями .NET, такими как разные версии .NET Framework и .NET Core, и платформы, такие как 32-разрядная и 64-разрядные платформы.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. По этим причинам не следует использовать реализацию этого метода по умолчанию в качестве уникального идентификатора объекта для хэширования.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.KeyedHashAlgorithmFor 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 и среда выполнения 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() , производных от, методможетделегироватьреализациюбазовогоклассатольковтомслучае,еслипроизводныйклассопределяетравенствонаравенствоссылок.GetHashCodeFor 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. — Метод для объекта должен постоянно возвращать тот же хэш-код, если в состоянии объекта нет изменений, определяющих возвращаемое значение метода [System. Object. Equals объекта.](xref:System.Object.Equals*) GetHashCode()- 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](xref: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. Кроме того, метод использует все символы в строке для создания разумного случайного распределения выходных данных, даже если входные данные кластеризованы в определенные диапазоны (например, многие пользователи могут иметь строки, содержащие только младшие символы ASCII 128, хотя Строка может содержать любой из 65 535 символов Юникода).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.

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

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