C# library to create a common interface to non-cryptographic hash functions.
Clone or download
Latest commit 9942b73 Apr 3, 2018
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
build Tweak build. Apr 4, 2018
src Merge branch 'master' into features/FarmHash Apr 4, 2018
tools Update tools. Jan 2, 2017
.gitignore Throw NotImplementedException for unreachable switch cases. Jan 22, 2017
.gitmodules Temp Oct 5, 2016
LICENSE Fix permissions Sep 11, 2016
README.md Minor readme updates Mar 30, 2018
appveyor.pr.yml Update pr config. Mar 31, 2018
appveyor.production.yml Remove appveyor cache. Mar 26, 2018
appveyor.yml Update main configuration. Mar 31, 2018

README.md

Data.HashFunction License

Data.HashFunction is a C# library to create a common interface to non-cryptographic hash functions and provide implementations of public hash functions. It is licensed under the permissive and OSI approved MIT license.

All functionality of the library is tested using xUnit. A primary requirement for each release is 100% code coverage by these tests.

All code within the libarary is commented using Visual Studio-compatible XML comments.

Status

Master

Build Status Test Status

NuGet

Name Normal
Data.HashFunction.Interfaces Version Status
Data.HashFunction.Core Version Status
Data.HashFunction.BernsteinHash Version Status
Data.HashFunction.Blake2 Version Status
Data.HashFunction.Buzhash Version Status
Data.HashFunction.CityHash Version Status
Data.HashFunction.CRC Version Status
Data.HashFunction.ELF64 Version Status
Data.HashFunction.FNV Version Status
Data.HashFunction.HashAlgorithm Version Status
Data.HashFunction.Jenkins Version Status
Data.HashFunction.MurmurHash Version Status
Data.HashFunction.Pearson Version Status
Data.HashFunction.SpookyHash Version Status
Data.HashFunction.xxHash Version Status

Implementations

All implementation packages depend on the Data.HashFunction.Interfaces and Data.HashFunction.Core NuGet packages.

The following hash functions have been implemented from the most reliable reference that could be found.

  • Bernstein Hash
    • BernsteinHash - Original
    • ModifiedBernsteinHash - Minor update that is said to result in better distribution
  • Blake2
    • Blake2b
  • BuzHash
    • BuzHashBase - Abstract implementation, there is no authoritative implementation
    • DefaultBuzHash - Concrete implementation, uses 256 random 64-bit integers
  • CityHash
  • CRC
    • CRC - Generalized implementation to allow any CRC parameters between 1 and 64 bits.
    • CRCStandards - 71 implementations on top of CRC that use the parameters defined by their respective standard. Standards and their parameters provided by CRC RevEng's catalogue.
  • ELF64
  • FNV
    • FNV1Base - Abstract base of the FNV-1 algorithms
    • FNV1 - Original
    • FNV1a - Minor variation of FNV-1
  • Hash Algorithm Wrapper
    • HashAlgorithmWrapper - Wraps existing instance of a .Net HashAlgorithm
    • HashAlgorithmWrapper - Wraps a managed instance of a .Net HashAlgorithm
  • Jenkins
    • JenkinsOneAtATime - Original
    • JenkinsLookup2 - Improvement upon One-at-a-Time hash function
    • JenkinsLookup3 - Further improvement upon Jenkins' Lookup2 hash function
  • Murmur Hash
    • MurmurHash1 - Original
    • MurmurHash2 - Improvement upon MurmurHash1
    • MurmurHash3 - Further improvement upon MurmurHash2, addresses minor flaws
  • Pearson hashing
    • PearsonBase - Abstract implementation, there is no authoritative implementation
    • WikipediaPearson - Concrete implementation, uses values from Wikipedia article
  • SpookyHash
    • SpookyHashV1 - Original
    • SpookyHashV2 - Improvement upon SpookyHashV1, fixes bug in original specification
  • xxHash
    • xxHash - Original and 64-bit version.

Each family of hash functions is contained within its own project and NuGet package.

Usage

The usage for all hash functions has been standardized and is accessible via the System.Data.HashFunction.IHashFunction and System.Data.HashFunction.IHashFunctionAsync interfaces. The core package, Data.HashFunction.Core, only contains abstract hash function implementations and base functionality for the library. In order to use a specific hashing algorithms, you will need to reference its implementation packages.

IHashFunction implementations should be immutable and stateles. All IHashFunction methods and members should be thread safe.

using System;
using System.Data.HashFunction;
using System.Data.HashFunction.Jenkins;

public class Program
{
    public static readonly IJenkinsOneAtATime _jenkinsOneAtATime = JenkinsOneAtATimeFactory.Instance.Create();
    public static void Main()
    {
        var hashValue = _jenkinsOneAtATime.ComputeHash("foobar");

        Console.WriteLine(hashValue.AsHexString());
    }
}

Release Notes

See Release Notes wiki page.

Contributing

Feel free to propose changes, notify of issues, or contribute code using GitHub! Submit issues and/or pull requests as necessary.

There are no special requirements for change proposal or issue notifications.

Code contributions should follow existing code's methodologies and style, along with XML comments for all public and protected namespaces, classes, and functions added.

License

Data.HashFunction is released under the terms of the MIT license. See LICENSE for more information or see http://opensource.org/licenses/MIT.