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