2016-07-15 18 views
-2

Ich habe eine Zeichenfolge, bestehend aus 2 Teilen (siehe Code)Konvertieren eine Zeichenfolge zu einzigartigen Langen

ich die UnknownDeterministicFunction wissen will, das eine lange zurückgibt, die die gleichen lange für eine bestimmte Zeichenfolge determinis produzieren können.

private void MyProgram() 
{ 
    string resultStr = "XXX"+"12345678"; 
    //1st part is a string of characters (the "XXX") 
    //2nd part is a string of numbers (the "12345678") 

    long resultLng = UnknownDeterministicFunction(myString); 
} 

private long UnknownDeterministicFunction(string inputStr) 
{ 
    // ??? 
} 

Ist dies in C# möglich?

+0

warum die negativen Stimme? – MajorInc

+0

Das scheint irgendwie vage. Ich meine, wenn Sie nicht in der Lage sein wollen, das lange zurück in die Zeichenfolge zu verwandeln, würde jeder gültige Hash-Code-Algorithmus tun, was Sie wollen. – juharr

+0

Ok macht Sinn - ich kann einfach http://stackoverflow.com/questions/9545619/a-fast-hash-function-for-string-in-c-sharp – MajorInc

Antwort

0

OK, die Antwort ist einfach.

private long UnknownDeterministicFunction(string inputStr) 
{ 
    //not taking care of null... 
    return (long)inputStr.GetHashCode() 
} 
+1

Zwei Probleme: Erstens: Wenn 'inputStr == null ', wird eine Ausnahme ausgelöst; Zweitens: * Hash * ist eine gute Wahl, aber es ist nicht * einzigartig *. Entschuldigung, die Antwort ist nicht * so einfach *. –

+0

Gegenbeispiel: * verschiedene * Strings '" 9331582 "' und '" 942 "' gibt den * gleichen * Hash '-1864841629' zurück (* C# 6.0 .Net 4.6 *); Ihre Lösung hat also nicht * einzigartig * 'lang 'produziert –

1

allererst

  • sind 8 ** (2 ** 30) verschiedenen Zeichenfolge s (der bis zu 2 GB lang)
  • dort sind 2 ** 64 different lang (welche sind 64-bit ganze Zahlen)

So können Sie nicht garantieren longeinzigartige (gute alte Pigeonhole Prinzip) sein. Wenn Sie bereit sind möglich, wenn auch unwahrscheinlich Kollisionen (das heißt unterschiedliche string s die gleiche long auch zurückgeben kann), können Sie Hash-Funktionen, zum Beispiel implementieren

hash function for string

oder

Good Hash Function for Strings

Normalerweise Hash-Funktion gibt Int32; nur in diesem Fall kombinieren zweiint in eine long

int hash1 = GetHashOneAlgorithm(myString); 
int hash2 = GetHashAnotherAlgorithm(myString); 

long result = ((long) hash1 << 32) | hash2;