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.
Können Sie uns sagen, welches Jahr das Spiel ist? Ziemlich moderne Zufallszahlengenerierungsfunktionen basieren auf den gleichen Ideen –
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
Sieht aus wie eine alte, gelöschte String-Hash-Funktion für mich. 'a << 5^a >> 27' ist ziemlich häufig zu sehen. – leppie