00001 #include "MurmurHash3.h"
00002
00003 using hash::MurmurHash3;
00004
00005
00006
00007 void MurmurHash3::Add(MsgPtr_t msg_ptr, Length_t len)
00008 {
00009 fSize += len;
00010 MixTail(msg_ptr,len);
00011
00012 while(len >= 4) {
00013 UInt_t k = *(reinterpret_cast<const UInt_t*>(msg_ptr));
00014 mmix(fHash, k);
00015 msg_ptr += 4;
00016 len -= 4;
00017 }
00018
00019 MixTail(msg_ptr,len);
00020 }
00021
00022
00023
00024
00025
00026
00027 MurmurHash3::Hash_t MurmurHash3::Value() const
00028 {
00029
00030 Hash_t hash = fHash;
00031 UInt_t tail = fTail;
00032 return EndImp(hash, tail);
00033 }
00034
00035
00036
00040 MurmurHash3::Hash_t MurmurHash3::End(UInt_t seed)
00041 {
00042 Hash_t ret_hash = EndImp(fHash, fTail);
00043 this->Reset(seed);
00044 return ret_hash;
00045 }
00046
00047
00048
00050 MurmurHash3::Hash_t& MurmurHash3::EndImp(Hash_t& hash, UInt_t& tail) const
00051 {
00052 if (tail) mmix(hash,tail);
00053 hash ^= fSize;
00054 final_mix(hash);
00055 return hash;
00056 }
00057
00058
00059
00060
00061
00062
00063
00064 void MurmurHash3::MixTail(MsgPtr_t& data, Length_t& len)
00065 {
00066 while( len && ((len<4) || fCount)) {
00067 fTail |= (*data++) << (fCount * 8);
00068 fCount++;
00069 len--;
00070
00071 if(fCount == 4){
00072 mmix(fHash, fTail);
00073 fTail = 0;
00074 fCount = 0;
00075 }
00076 }
00077 }
00078
00079
00080