Public Member Functions | Static Public Member Functions

Dedupe::Hash::Hash32 Class Reference

Public Member Functions

 Hash32 ()
 Hash32 (void *data, uint64__ length)
void GenerateHash (void *data, uint64__ length)
void HashMultiplyFileInfo (Dedupe::FileStream &stream)
void AddToHash (void *data, uint64__ length)
uint32__ GetHash ()
void Display ()
bool operator== (const Hash32 &h1) const
bool operator!= (const Hash32 &h1) const

Static Public Member Functions

static uint32__ GetHash (void *data, uint64__ length)

Detailed Description

Definition at line 21 of file hash.h.


Constructor & Destructor Documentation

Hash32::Hash32 ( void   ) 

Initiate the class with a 0 hash

Definition at line 10 of file hash32.cpp.

{
        hash = 0;
}

Hash32::Hash32 ( void *  data,
uint64__  length 
)

Initiate the class and generate a hash out of the data

Parameters:
data The datafield providing the binary data to generate the hash.
length The length of the datafield.

Definition at line 15 of file hash32.cpp.

{
        hash = OFFSET_BASIS32;  //Initialise
        uint64__ i = 0;
        char *data2 = static_cast<char*>(data);
        hashvar *longdata = static_cast<hashvar*>(data);
        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
        {
                for(; i < (length % sizeof(hashvar)); i++)
                {
                        hash = (hash ^ *(data2++)) * MAGIC32;    //hashen
                }
        }
        longdata += (length % sizeof(hashvar));
        for(; i < length; i+=sizeof(hashvar))
        {
                hash = (hash ^ *(longdata++)) * MAGIC32;        //Hash the rest
        }
}


Member Function Documentation

void Hash32::AddToHash ( void *  data,
uint64__  length 
)

The function add data to the Hash. Reqiers a initiated class and a genrated hash.

Parameters:
data The datafield providing the binary data to generate the hash.
length The length of the datafield.

Definition at line 55 of file hash32.cpp.

Referenced by Dedupe::Hash::Hash64::HashMultiplyFileInfo(), and HashMultiplyFileInfo().

{
        if(hash == 0)
        {
                return;
        }
        uint64__ i = 0;
        char *data2 = static_cast<char*>(data);
        hashvar *longdata = static_cast<hashvar*>(data);
        if((length % sizeof(hashvar)) != 0)
        {
                for(; i < (length % sizeof(hashvar)); i++)
                {
                        hash = (hash ^ *data2++) * MAGIC32;
                }
        }
        longdata += (data2 - static_cast<char*>(data));
        for(; i < length; i+=sizeof(hashvar))
        {
                hash = (hash ^ *longdata++) * MAGIC32;
        }
}

void Hash32::Display (  ) 

Displays the Hash in the console.

Definition at line 78 of file hash32.cpp.

{
        if(this->hash == 0)
        {
                cout << "Empty Hash" << endl;
                return;
        }
        cout << "Hash: " << hex << hash << endl;
}

void Hash32::GenerateHash ( void *  data,
uint64__  length 
)

Generates out of the data a new Hash. The function overrides the old hash.

Parameters:
data The datafield providing the binary data to generate the hash.
length The length of the datafield.

Definition at line 35 of file hash32.cpp.

{
        hash = OFFSET_BASIS32;
        uint64__ i = 0;
        char *data2 = static_cast<char*>(data);
        hashvar *longdata = static_cast<hashvar*>(data);
        if((length % sizeof(hashvar)) != 0)
        {
                for(; i < (length % sizeof(hashvar)); i++)
                {
                        hash = (hash ^ *(data2++)) * MAGIC32;
                }
        }
        longdata += (length % sizeof(hashvar));
        for(; i < length; i+=sizeof(hashvar))
        {
                hash = (hash ^ *(longdata++)) * MAGIC32;
        }
}

uint32__ Hash32::GetHash ( void *  data,
uint64__  length 
) [static]

Generates out of the data a new Hash and returns it

Parameters:
data The datafield providing the binary data to generate the hash.
length The length of the datafield.
Returns:
The Hash as a 32-Bit integer

Definition at line 88 of file hash32.cpp.

Referenced by Dedupe::Hash::Hash64::HashMultiplyFileInfo(), and HashMultiplyFileInfo().

{
        hashvar nHash = OFFSET_BASIS32;
        uint64__ i = 0;
        char *data2 = static_cast<char*>(data);
        hashvar *longdata = static_cast<hashvar*>(data);
        if((length % sizeof(hashvar)) != 0)
        {
                for(; i < (length % sizeof(hashvar)); i++)
                {
                        nHash = (nHash ^ *(data2++)) * MAGIC32;
                }
        }
        longdata += (length % sizeof(hashvar));
        for(; i < length; i+=sizeof(hashvar))
        {
                nHash = (nHash ^ *(longdata++)) * MAGIC32;
        }
        return nHash;
}

uint32__ Dedupe::Hash::Hash32::GetHash (  )  [inline]

Returns the hash as a 32 bit integer

Returns:
The hash as 32 bit unsigned integer.

Definition at line 61 of file hash.h.

                {
                        return hash;
                }

void Hash32::HashMultiplyFileInfo ( Dedupe::FileStream &  stream  ) 

Generats for all given FileInfo objects the hash

Parameters:
stream A pointer to the filestream with the FileInfo objects

Definition at line 109 of file hash32.cpp.

References AddToHash(), and GetHash().

{
        Dedupe::FileStream::iterator it;
        ifstream *file = new ifstream();
        char *data = new char[104857600];
        unsigned long long int length = 0;
        for(it = stream.begin(); it < stream.end(); it++)
        {
                file->open(it->GetPath().c_str(), ifstream::in);
                file->seekg(0, ios::end);
                length = file->tellg();
                file->seekg(0, ios::beg);

                file->read(data, (104857600 > length)?(length):(104857600));
                Hash32 hash(data, (104857600 > length)?(length):(104857600));
                length -= (104857600 > length)?(length):(104857600);
                while(file->good() && length > 0)
                {
                        file->read(data, (104857600 > length)?(length):(104857600));
                        hash.AddToHash(data, (104857600 > length)?(length):(104857600));
                        length -= 104857600;
                }
                file->close();
                it->SetHash( hash.GetHash() );
        }
        delete file;
        delete data;
}


The documentation for this class was generated from the following files: