Cryptographic hash functions play a fundamental role in modern cryptography. These types of hash functions are often used for data integrity as well as in message authentication schemes. Hashing functions take arbitrary input of finite length and produce a fixed size output typically referred to as a hash-code, hash-value or simply a hash. The purpose of a hash is to allow an input of arbitrary length, be it a string or a large file, to be represented by a finite length sequence. There are two broad classes of hash functions, keyed and unkeyed. Keyed hash functions are often times used in conjunction with message authentication schemes. A keyed hash functions takes not only the data to be hashed as an input, but also a 2nd parameter, referred to as the key. The hashing algorithm then uses the actual data along with the provided key to generate a hash. Unkeyed hash functions are generally used for data integrity. The original data is passed into the hashing function and the resulting hash is saved. At a later time a copy of the data hashed and the hash values are compared. If the hash values are the same, for all intensive purposes, the original and the copy are identical. However, if the hash values are different, the integrity of the copy is not to be trusted, as the data may have been inadvertantly altered during transmission, or even worse, it may have been altered on purpose for malicious purposes.