2011-01-06 4 views
2

ich Reverse-Engineering des Archivdateiformat von einem alten Spiel verwendet, und entdeckte, dass es Dateinamen mit der folgenden Funktion (dekompilierten von Hand) gehasht:Was ist diese Hash-Funktion?

int hash(char* filename) { 
    unsigned int a = 0; 
    int b = 0; 
    for(int i = strlen(filename)-1; i>=0; i--) 
    char c = toupper(filename[i]); 
    a=(a<<5)+(a>>25); 
    b+=c; 
    a+=b+c; 
    } 
    return a; 
} 

Ich frage mich, ob dies alles Standard, oder wenn es nur zufällig von den Entwicklern ausgewählt wird.

+0

Können Sie uns sagen, welches Jahr das Spiel ist? Ziemlich moderne Zufallszahlengenerierungsfunktionen basieren auf den gleichen Ideen –

+0

es ähnelt einem Shift-Add-XOR-Hash, aber mit zusätzlichen Zusätzen anstelle von XORing; Siehe http://eternallyconfuzzled.com/tuts/algorithms/jsw_tut_hashing.aspx#existing für einige existierende Hash-Algorithmen. – Christoph

+0

Sieht aus wie eine alte, gelöschte String-Hash-Funktion für mich. 'a << 5^a >> 27' ist ziemlich häufig zu sehen. – leppie

Antwort

2

Es stellt keine Standard-Hash-Funktion dar, einfach nur "handgemacht".