String.GetHashCode Metod
Definition
Viktigt
En del information gäller för förhandsversionen av en produkt och kan komma att ändras avsevärt innan produkten blir allmänt tillgänglig. Microsoft lämnar inga garantier, uttryckliga eller underförstådda, avseende informationen som visas här.
Överlagringar
| Name | Description |
|---|---|
| GetHashCode() |
Returnerar hash-koden för den här strängen. |
| GetHashCode(StringComparison) |
Returnerar hash-koden för den här strängen med hjälp av de angivna reglerna. |
GetHashCode()
Returnerar hash-koden för den här strängen.
public:
override int GetHashCode();
public override int GetHashCode();
override this.GetHashCode : unit -> int
Public Overrides Function GetHashCode () As Integer
Returer
En 32-bitars signerad heltalshashkod.
Exempel
I följande exempel visas metoden GetHashCode med hjälp av olika indatasträngar.
using System;
class GetHashCode
{
public static void Main()
{
DisplayHashCode( "" );
DisplayHashCode( "a" );
DisplayHashCode( "ab" );
DisplayHashCode( "abc" );
DisplayHashCode( "abd" );
DisplayHashCode( "abe" );
DisplayHashCode( "abcdef" );
DisplayHashCode( "abcdeg" );
DisplayHashCode( "abcdeh" );
DisplayHashCode( "abcdei" );
DisplayHashCode( "Abcdeg" );
DisplayHashCode( "Abcdeh" );
DisplayHashCode( "Abcdei" );
}
static void DisplayHashCode( String Operand )
{
int HashCode = Operand.GetHashCode( );
Console.WriteLine("The hash code for \"{0}\" is: 0x{1:X8}, {1}",
Operand, HashCode );
}
}
/*
This example displays output like the following:
The hash code for "" is: 0x2D2816FE, 757602046
The hash code for "a" is: 0xCDCAB7BF, -842352705
The hash code for "ab" is: 0xCDE8B7BF, -840386625
The hash code for "abc" is: 0x2001D81A, 536991770
The hash code for "abd" is: 0xC2A94CB5, -1029092171
The hash code for "abe" is: 0x6550C150, 1699791184
The hash code for "abcdef" is: 0x1762906D, 392335469
The hash code for "abcdeg" is: 0x1763906D, 392401005
The hash code for "abcdeh" is: 0x175C906D, 391942253
The hash code for "abcdei" is: 0x175D906D, 392007789
The hash code for "Abcdeg" is: 0x1763954D, 392402253
The hash code for "Abcdeh" is: 0x175C954D, 391943501
The hash code for "Abcdei" is: 0x175D954D, 392009037
*/
let displayHashCode operand =
let hashCode = operand.GetHashCode()
printfn $"The hash code for \"%s{operand}\" is: 0x{1:X8}, {hashCode}"
displayHashCode ""
displayHashCode "a"
displayHashCode "ab"
displayHashCode "abc"
displayHashCode "abd"
displayHashCode "abe"
displayHashCode "abcdef"
displayHashCode "abcdeg"
displayHashCode "abcdeh"
displayHashCode "abcdei"
displayHashCode "Abcdeg"
displayHashCode "Abcdeh"
displayHashCode "Abcdei"
(*
This example displays output like the following:
The hash code for "" is: 0x2D2816FE, 757602046
The hash code for "a" is: 0xCDCAB7BF, -842352705
The hash code for "ab" is: 0xCDE8B7BF, -840386625
The hash code for "abc" is: 0x2001D81A, 536991770
The hash code for "abd" is: 0xC2A94CB5, -1029092171
The hash code for "abe" is: 0x6550C150, 1699791184
The hash code for "abcdef" is: 0x1762906D, 392335469
The hash code for "abcdeg" is: 0x1763906D, 392401005
The hash code for "abcdeh" is: 0x175C906D, 391942253
The hash code for "abcdei" is: 0x175D906D, 392007789
The hash code for "Abcdeg" is: 0x1763954D, 392402253
The hash code for "Abcdeh" is: 0x175C954D, 391943501
The hash code for "Abcdei" is: 0x175D954D, 392009037
*)
Module GetHashCode
Sub Main()
DisplayHashCode("")
DisplayHashCode("a")
DisplayHashCode("ab")
DisplayHashCode("abc")
DisplayHashCode("abd")
DisplayHashCode("abe")
DisplayHashCode("abcdef")
DisplayHashCode("abcdeg")
DisplayHashCode("abcdeh")
DisplayHashCode("abcdei")
DisplayHashCode("Abcdeg")
DisplayHashCode("Abcdeh")
DisplayHashCode("Abcdei")
End Sub
Sub DisplayHashCode(Operand As String)
Dim HashCode As Integer = Operand.GetHashCode()
Console.WriteLine("The hash code for ""{0}"" is: 0x{1:X8}, {1}",
Operand, HashCode)
End Sub
End Module
' This example displays output like the following:
' The hash code for "" is: 0x2D2816FE, 757602046
' The hash code for "a" is: 0xCDCAB7BF, -842352705
' The hash code for "ab" is: 0xCDE8B7BF, -840386625
' The hash code for "abc" is: 0x2001D81A, 536991770
' The hash code for "abd" is: 0xC2A94CB5, -1029092171
' The hash code for "abe" is: 0x6550C150, 1699791184
' The hash code for "abcdef" is: 0x1762906D, 392335469
' The hash code for "abcdeg" is: 0x1763906D, 392401005
' The hash code for "abcdeh" is: 0x175C906D, 391942253
' The hash code for "abcdei" is: 0x175D906D, 392007789
' The hash code for "Abcdeg" is: 0x1763954D, 392402253
' The hash code for "Abcdeh" is: 0x175C954D, 391943501
' The hash code for "Abcdei" is: 0x175D954D, 392009037
Kommentarer
Beteendet för är beroende av GetHashCode dess implementering, vilket kan ändras från en version av den gemensamma språkkörningen till en annan. En anledning till att detta kan inträffa är att förbättra prestandan GetHashCodeför .
Important
Om två strängobjekt är lika GetHashCode med returnerar metoden identiska värden. Det finns dock inget unikt hashkodvärde för varje unikt strängvärde. Olika strängar kan returnera samma hash-kod.
Själva hash-koden är inte garanterad att vara stabil. Hash-koder för identiska strängar kan skilja sig åt mellan .NET implementeringar, mellan .NET versioner och mellan .NET plattformar (till exempel 32-bitars och 64-bitars) för en enda version av .NET. I vissa fall kan de till och med skilja sig åt beroende på programdomän. Detta innebär att två efterföljande körningar av samma program kan returnera olika hash-koder.
Därför bör hash-koder aldrig användas utanför programdomänen där de skapades, de bör aldrig användas som nyckelfält i en samling och de bör aldrig bevaras.
Slutligen ska du inte använda hashkoden i stället för ett värde som returneras av en kryptografisk hashfunktion om du behöver en kryptografiskt stark hash. För kryptografiska hashar använder du en klass som härletts från System.Security.Cryptography.HashAlgorithm klassen eller System.Security.Cryptography.KeyedHashAlgorithm .
Mer information om hashkoder finns i Object.GetHashCode.
I .NET Framework-skrivbordsappar kan du använda <UseRandomizedStringHashAlgorithm> element för att generera unika hashkoder per programdomän. Detta kan minska antalet kollisioner och förbättra den övergripande prestandan för infogningar och sökningar som använder hash-tabeller. I följande exempel visas hur du använder elementet< UseRandomizedStringHashAlgorithm>. Den definierar en DisplayString klass som innehåller en privat strängkonstant, , svars värde är "Det här är en sträng". Den innehåller också en ShowStringHashCode metod som visar strängvärdet och dess hash-kod tillsammans med namnet på programdomänen där metoden körs.
using System;
public class Example
{
public static void Main()
{
// Show hash code in current domain.
DisplayString display = new DisplayString();
display.ShowStringHashCode();
// Create a new app domain and show string hash code.
AppDomain domain = AppDomain.CreateDomain("NewDomain");
var display2 = (DisplayString) domain.CreateInstanceAndUnwrap(typeof(Example).Assembly.FullName,
"DisplayString");
display2.ShowStringHashCode();
}
}
public class DisplayString : MarshalByRefObject
{
private String s = "This is a string.";
public override bool Equals(Object obj)
{
String s2 = obj as String;
if (s2 == null)
return false;
else
return s == s2;
}
public bool Equals(String str)
{
return s == str;
}
public override int GetHashCode()
{
return s.GetHashCode();
}
public override String ToString()
{
return s;
}
public void ShowStringHashCode()
{
Console.WriteLine("String '{0}' in domain '{1}': {2:X8}",
s, AppDomain.CurrentDomain.FriendlyName,
s.GetHashCode());
}
}
open System
type DisplayString() =
inherit MarshalByRefObject()
let s = "This is a string."
override _.Equals(obj) =
match obj with
| :? string as s2 -> s = s2
| _ -> false
member _.Equals(str) =
s = str
override _.GetHashCode() =
s.GetHashCode()
override _.ToString() =
s
member _.ShowStringHashCode() =
printfn $"String '{s}' in domain '{AppDomain.CurrentDomain.FriendlyName}': {s.GetHashCode():X8}"
// Show hash code in current domain.
let display = DisplayString()
display.ShowStringHashCode()
// Create a new app domain and show string hash code.
let domain = AppDomain.CreateDomain "NewDomain"
let display2 = domain.CreateInstanceAndUnwrap(typeof<DisplayString>.Assembly.FullName, "DisplayString") :?> DisplayString
display2.ShowStringHashCode()
Module Example
Public Sub Main()
' Show hash code in current domain.
Dim display As New DisplayString()
display.ShowStringHashCode()
' Create a new app domain and show string hash code.
Dim domain As AppDomain = AppDomain.CreateDomain("NewDomain")
Dim display2 = CType(domain.CreateInstanceAndUnwrap(GetType(Example).Assembly.FullName,
"DisplayString"), DisplayString)
display2.ShowStringHashCode()
End Sub
End Module
Public Class DisplayString : Inherits MarshalByRefObject
Private s As String = "This is a string."
Public Overrides Function Equals(obj As Object) As Boolean
Dim s2 As String = TryCast(obj, String)
If s2 Is Nothing Then
Return False
Else
Return s = s2
End If
End Function
Public Overloads Function Equals(str As String) As Boolean
Return s = str
End Function
Public Overrides Function GetHashCode() As Integer
Return s.GetHashCode()
End Function
Public Overrides Function ToString() As String
Return s
End Function
Public Sub ShowStringHashCode()
Console.WriteLine("String '{0}' in domain '{1}': {2:X8}",
s, AppDomain.CurrentDomain.FriendlyName,
s.GetHashCode())
End Sub
End Class
När du kör exemplet utan att ange en konfigurationsfil visas utdata som liknar följande. Observera att hash-koderna för strängen är identiska i de två programdomänerna.
String 'This is a string.' in domain 'PerDomain.exe': 941BCEAC
String 'This is a string.' in domain 'NewDomain': 941BCEAC
Men om du lägger till följande konfigurationsfil i exemplets katalog och sedan kör exemplet, skiljer sig hash-koderna för samma sträng efter programdomän.
<?xml version ="1.0"?>
<configuration>
<runtime>
<UseRandomizedStringHashAlgorithm enabled="1" />
</runtime>
</configuration>
När konfigurationsfilen finns visar exemplet följande utdata:
String 'This is a string.' in domain 'PerDomain.exe': 5435776D
String 'This is a string.' in domain 'NewDomain': 75CC8236
Important
Hash-koder används för att effektivt infoga och hämta nyckelade objekt från hash-tabeller. Hashkoder identifierar dock inte strängar unikt. Identiska strängar har samma hash-koder, men den vanliga språkkörningen kan också tilldela samma hash-kod till olika strängar. Dessutom kan hash-koder variera beroende på version av .NET, per plattform i en enda version och efter programdomän. Därför bör du inte serialisera eller bevara hashkodvärden och inte heller använda dem som nycklar i en hash-tabell eller ordlista.
Mer information om användningen av hash-koder och -metoden Object.GetHashCodefinns i GetHashCode .
Anteckningar till anropare
Värdet som returneras av GetHashCode() är plattformsberoende. Den skiljer sig åt i 32- och 64-bitarsversionerna av .NET Framework. Det kan också skilja sig mellan versioner av .NET Framework och .NET Core.
Se även
Gäller för
GetHashCode(StringComparison)
Returnerar hash-koden för den här strängen med hjälp av de angivna reglerna.
public:
int GetHashCode(StringComparison comparisonType);
public int GetHashCode(StringComparison comparisonType);
override this.GetHashCode : StringComparison -> int
Public Function GetHashCode (comparisonType As StringComparison) As Integer
Parametrar
- comparisonType
- StringComparison
Ett av uppräkningsvärdena som anger de regler som ska användas i jämförelsen.
Returer
En 32-bitars signerad heltalshashkod.