21

Discohash – Fast Hash

 3 years ago
source link: https://github.com/cris691/discohash
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

:dancers: Discohash

2-5GB/s, passed SMHasher

Discohash( also known as BEBB4185 ) is a super simple and super fast hash that passes all of SMHasher, and runs at 2-5GB/s (depending on hardware) in this naive, portable, serial implementation.

Link to the SUPERCOP ECRYPT benchmark for bebb4185

CLI app included

Quick Facts

  • A super-fast 64-bit hash.
  • one of the fastest hashes ever benchmarked at ecrypt
  • ECRYPT benchmark is 4x faster than BLAKE3
  • Mix is super simple.
  • Tested at ~ 5GB/s @ 3Gz, (Google Cloud Platform, N1 CPU)
  • Passes all SMHasher tests.
  • Also known as : BEBB4185
  • Implemented in C++, and also a port to JS
  • This repo includes a simple CLI app for hashing files or stdin from the command line.

Simplicity

The main 128-bit-to-128-bit mixing function is just this:

mix(const int A)
    {
      const int B = A+1;
      
      ds[A] *= P;
      ds[A] = rot(ds[A], 23);
      ds[A] *= Q;
      
      ds[B] ^= ds[A];

      ds[B] *= P;
      ds[B] = rot(ds[B], 23);
      ds[B] *= Q;
    }

which is just multiplications by two 64-bit primes, P and Q, bit rotation, and xor.

P, and Q are:

  • P = 0xFFFFFFFFFFFFFFFF - 58
  • Q = 13166748625691186689

The internal state is 256-bits and the mixing function windows across that.

The standard digest is 64-bits, but you can modify it to take 128-bits if you want a cryptographically secure hash.

Using

Use the C code from this repository, either in your project or as a CL-app (included):

cd src
./build.sh
./bin/bebbsum < 0xa2a647993898a3df.txt
> 0xa2a647993898a3df
./bin/bebbsum 0xa2a647993898a3df.txt
> 0xa2a647993898a3df

or, for a JS implementation:

npm i --save bebb4185

Use in Node.JS:

import {discohash} from 'bebb4185'

Or using Snowpack as a webmodule:

import {discohash} from './web_modules/bebb4185.js';

Then call it:

const hash = discohash(string_or_typed_array_key, optional_seed);

JS Implementation

uint64_t

SMHasher verification value

The value is: BEBB4185

Possible future work

Make a parallel version using Merkle tree


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK