• Main Page
  • Namespaces
  • Data Structures
  • Files
  • File List

/www/proggenOrg/dedupe/export/trunk/hash/hash32.cpp

00001 //Hash.cpp
00002 //by Jochen Hebeler, 2010
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;  //Initialise
00018         uint64__ i = 0;
00019         char *data2 = static_cast<char*>(data);
00020         hashvar *longdata = static_cast<hashvar*>(data);
00021         if((length % sizeof(hashvar)) != 0) //If the length isn't dividable by the size of the hashvar, hash the single bytes until it is easy hashable
00022         {
00023                 for(; i < (length % sizeof(hashvar)); i++)
00024                 {
00025                         hash = (hash ^ *(data2++)) * MAGIC32;    //hashen
00026                 }
00027         }
00028         longdata += (length % sizeof(hashvar));
00029         for(; i < length; i+=sizeof(hashvar))
00030         {
00031                 hash = (hash ^ *(longdata++)) * MAGIC32;        //Hash the rest
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 }

Generated on Tue Nov 22 2011 22:55:38 for Dedupe by  doxygen 1.7.1