2016-10-19 3 views
1

Ich habe versucht, der djb2-Hash-Funktion Funktionalität hinzuzufügen, aber es scheint die Änderungen nicht zu mögen. Insbesondere versuche ich, eine Schleife einzuschließen, die Wörter (Strings) in Kleinbuchstaben konvertiert. Es führt die folgenden zwei Fehler:Problem mit der Hash-Funktion - Hinzufügen der Funktionalität

  1. Unverträgliche Ganzzahl-Umwandlungs Zeiger auf char * von int Zuordnung
  2. Wert kann nicht vom Typ dass *str++ erschienen im ursprünglichen Code char *[45]

Hinweis Inkrement in der while loop . Dies ist meine erste Hash-Tabelle, und ich bin ziemlich wackelig auf Zeiger. Jeder Einblick, wo ich falsch gelaufen bin, würde geschätzt werden.

// djb2 by Dan Bernstein -- slightly modified; 
unsigned int hash_function(const char* str) 
{ 
    unsigned int hash = 5381; 
    int c; 
    char* string[45]; 

    for (int i = 0; str[i] != '\0'; i++) 
    { 
     string[i] = (tolower(str[i])); 
    } 

    while (c == *string++) 
     hash = ((hash << 5) + hash) + c; /* hash * 33 + c */ 

    return (hash % LISTS); 
} 

Antwort

1

Effizientere Version Ihres hash:

unsigned int hash_function(const char* str) 
{ 
    unsigned int hash = 5381, c; 
    while(c = *str++) 
     hash += (hash << 5) + (c | 040); 

    return (hash % LISTS); 
} 
+0

Sehr geschätzt! Ich nehme an, das ist eine Neuformulierung des Originals und konvertiert nicht alles in Kleinbuchstaben? Aus Neugierde, was genau (c | 040) bedeutet/tut. Die Kombination aus einem Zeichen und einem bitweisen OR erscheint ungewöhnlich. Ich habe erst vor kurzem begonnen, auf der Bit-Ebene zu arbeiten, was sowohl cool als auch total mind @ # $ &% ist. – Ryan

+1

(x | 040) wandelt "x" in Kleinbuchstaben um und ändert die Zahlen nicht. Es ändert jedoch einige STRG-Symbole in einige druckbare Symbole. Dies ist jedoch für Hash-Zwecke nicht wichtig. – maxihatop

1

Dieses:

char* string[45]; 

bedeutet "Anordnung von 45 Zeichenzeiger", sollten Sie den Stern fallen.

Und Sie können nicht über ein Array iterieren, indem Sie die Variable inkrementieren, die Array-Variable kann nicht geändert werden. Sie können einen separaten Zeiger verwenden:

const char *s = string; 
while (c = *s++) 

Beachten Sie, dass Zuordnung = geschrieben wird, während == Vergleich auf Gleichheit ist das ist nicht das, was Sie meinen.

+0

Vielen Dank für die Antwort und Aufklärung! Ich versuche es mal! – Ryan

Verwandte Themen