16 #ifndef __OMNETPP_CHASHER_H
17 #define __OMNETPP_CHASHER_H
22 #include "simkerneldefs.h"
24 #include "cexception.h"
44 void merge(uint32_t x) {
46 value = ((value << 1) | (value >> 31)) ^ x;
49 void merge2(uint64_t x) {
51 merge((uint32_t)(x>>32));
58 cHasher() {ASSERT(
sizeof(uint32_t)==4); ASSERT(
sizeof(
double)==8); value = 0;}
62 void reset() {value = 0;}
63 void add(
char d) {merge((uint32_t)d);}
64 void add(
short d) {merge((uint32_t)d);}
65 void add(
int d) {merge((uint32_t)d);}
66 void add(
long d) {int64_t tmp=d; merge2((uint64_t)tmp);}
67 void add(
long long d) {merge2((uint64_t)d);}
68 void add(
unsigned char d) {merge((uint32_t)d);}
69 void add(
unsigned short d) {merge((uint32_t)d);}
70 void add(
unsigned int d) {merge((uint32_t)d);}
71 void add(
unsigned long d) {uint64_t tmp=d; merge2(tmp);}
72 void add(
unsigned long long d) {merge2(d);}
73 void add(
double d) {
union _ {
double d; uint64_t i;}; merge2(((
union _ *)&d)->i);}
75 void add(
const char *s) {
if (s) add(s, strlen(s)+1);
else add(0);}
76 void add(
const std::string& s) {add(s.c_str(), s.size()+1);}
77 void add(
const void *p,
size_t length);
79 cHasher& operator<<(
const T& x) {add(x);
return *
this;}
94 uint32_t parse(
const char *hash)
const;
99 bool equals(
const char *hash)
const;
104 std::string str()
const;