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

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

00001 //Hash.cpp
00002 //by Jochen Hebeler, 2010
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 }

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