2016-07-20 7 views
1

I eine Struktur in C definiert haben, wieComputing Hashwert eines struct in C

folgt
typedef struct { 
    unsigned int size; 
    unsigned int pool_size; 
    route _routes[SIZE_OF_FLEET]; 
    request _request_pool[SIZE_OF_PROBLEM]; 
    /* stores which request is contained in which route */ 
    unsigned int _request_map[SIZE_OF_PROBLEM]; 
} solution; 

Ich versuche, eine Hash-Funktion für diese Struktur wie folgt zu definieren

unsigned long long solution_hash(solution const *_sol) 
{ 
    unsigned long long hash = 0; 
    unsigned short c; 
    unsigned short *reinterpret_sol; 
    reinterpret_sol = (unsigned short*)&_sol; 
    size_t size_ = sizeof(solution); 
    size_t elem_size_ = sizeof(unsigned short); 
    int len = (int)size_/elem_size_; 

    for (int i = 0; i < len; i++) { 
     c = reinterpret_sol[i]; 
     hash += c; 
    } 
    return hash; 
} 

Das Problem ist, Immer wenn ich die Funktion solution_hash aufruft, ändert sich der Hash-Wert derselben Lösung. Aufeinanderfolgende Aufrufe erhöhen den Wert für dieselbe Lösung um 32.

Was ist falsch an diesem Code? Gibt es eine bessere Möglichkeit, eine Hash-Funktion für eine Struktur zu implementieren?

+3

'reinterpret_sol = (unsigned short *) &_sol;' - Sind Sie sicher '&'? Auf jeden Fall sieht es so aus, als würde man die * strikte Aliasing * -Regel brechen. –

+0

Oh, vielen Dank. Ich habe stundenlang versucht, was mit dem Code nicht stimmt, und Sie haben es in weniger als einer Minute herausgefunden :) –

+0

"Gibt es eine bessere Möglichkeit, eine Hash-Funktion für eine Struktur zu implementieren?" Ja, aber es hängt von Hashing-Zielen ab, die noch nicht angegeben sind. – chux

Antwort

0

Casting versteckte das Problem wie erwähnt durch @Eugene Sh.

// reinterpret_sol = (unsigned short*)&_sol; 
reinterpret_sol = (unsigned short*) _sol;