00001
00002
00003
00004 #include "hash.h"
00005
00006 using namespace std;
00007 using namespace Dedupe::Hash;
00008
00009 Hash64::Hash64(void)
00010 {
00011 hash = 0;
00012 }
00013
00014 Hash64::Hash64(void *data, uint64__ length)
00015 {
00016 hash = OFFSET_BASIS64;
00017 uint64__ i = 0;
00018 char *data2 = static_cast<char*>(data);
00019 uint64__ *longdata = static_cast<uint64__*>(data);
00020 if((length % sizeof(uint64__)) != 0)
00021 {
00022 for(; i < (length % sizeof(uint64__)); i++)
00023 {
00024 hash = (hash ^ *data2++) * MAGIC64;
00025 }
00026 }
00027 longdata += (length % sizeof(uint64__));
00028 for(; i < length; i += sizeof(uint64__))
00029 {
00030 hash = (hash ^ *longdata++) * MAGIC64;
00031 }
00032 }
00033
00034 void Hash64::GenerateHash(void *data, uint64__ length)
00035 {
00036 hash = OFFSET_BASIS64;
00037 uint64__ i = 0;
00038 char *data2 = static_cast<char*>(data);
00039 uint64__ *longdata = static_cast<uint64__*>(data);
00040 if((length % sizeof(uint64__)) != 0)
00041 {
00042 for(; i < (length % sizeof(uint64__)); i++)
00043 {
00044 hash = (hash ^ *data2++) * MAGIC64;
00045 }
00046 }
00047 longdata += (length % sizeof(uint64__));
00048 for(; i < length; i += sizeof(uint64__))
00049 {
00050 hash = (hash ^ *longdata++) * MAGIC64;
00051 }
00052 }
00053
00054 void Hash64::AddToHash(void *data, uint64__ length)
00055 {
00056 if(hash == 0)
00057 {
00058 return;
00059 }
00060 uint64__ i = 0;
00061 char *data2 = static_cast<char*>(data);
00062 uint64__ *longdata = static_cast<uint64__*>(data);
00063 if((length % sizeof(uint64__)) != 0)
00064 {
00065 for(; i < (length % sizeof(uint64__)); i++)
00066 {
00067 hash = (hash ^ *data2++) * MAGIC64;
00068 }
00069 }
00070 longdata += (length % sizeof(uint64__));
00071 for(; i < length; i += sizeof(uint64__))
00072 {
00073 hash = (hash ^ *longdata++) * MAGIC64;
00074 }
00075 }
00076
00077 void Hash64::Display()
00078 {
00079 if(this->hash == 0)
00080 {
00081 cout << "Empty Hash" << endl;
00082 return;
00083 }
00084 cout << "Hash: " << hex << hash << endl;
00085 }
00086
00087 uint64__ Hash64::GetHash(void* data, uint64__ length)
00088 {
00089 uint64__ nHash = OFFSET_BASIS64;
00090 uint64__ i = 0;
00091 char *data2 = static_cast<char*>(data);
00092 uint64__ *longdata = static_cast<uint64__*>(data);
00093 if((length % sizeof(uint64__)) != 0)
00094 {
00095 for(; i < (length % sizeof(uint64__)); i++)
00096 {
00097 nHash = (nHash ^ *data2++) * MAGIC64;
00098 }
00099 }
00100 longdata += (length % sizeof(uint64__));
00101 for(; i < length; i += sizeof(uint64__))
00102 {
00103 nHash = (nHash ^ *longdata++) * MAGIC64;
00104 }
00105 return nHash;
00106 }
00107
00108 void Hash64::HashMultiplyFileInfo(Dedupe::FileStream &stream)
00109 {
00110 Dedupe::FileStream::iterator it;
00111 ifstream *file = new ifstream();
00112 char *data = new char[104857600];
00113 unsigned long long int length = 0;
00114 for(it = stream.begin(); it < stream.end(); it++)
00115 {
00116 file->open(it->GetPath().c_str(), ifstream::in);
00117 file->seekg(0, ios::end);
00118 length = file->tellg();
00119 file->seekg(0, ios::beg);
00120
00121 file->read(data, (104857600 > length)?(length):(104857600));
00122 Hash32 hash(data, (104857600 > length)?(length):(104857600));
00123 length -= (104857600 > length)?(length):(104857600);
00124 while(file->good() && length > 0)
00125 {
00126 file->read(data, (104857600 > length)?(length):(104857600));
00127 hash.AddToHash(data, (104857600 > length)?(length):(104857600));
00128 length -= 104857600;
00129 }
00130 file->close();
00131 it->SetHash( hash.GetHash() );
00132 }
00133 delete file;
00134 delete data;
00135 }