0.2.5 • Published 4 years ago

resumable-hash v0.2.5

Weekly downloads
6
License
MIT
Repository
github
Last release
4 years ago

Resumable Hash Build Status

A functional, native implementation of resumable SHA-1 and SHA-256

Disclaimer

This is not a cryptographic hash implementation. It does not prevent against side-channel attacks, et al. If you require a cryptographic hash function, use the Node.js crypto module instead.

Installation

npm install resumable-hash

Usage

import {Hash, HashType} from 'resumable-hash';

new Hash(type, [init])

Constructs a hash of a certain type, with an optional initialisation payload.

Available types:

  • HashType.Sha1
  • HashType.Sha256

Hash#update(data): Promise<Hash>

Updates the hash with the given data buffer. Does not modify the current hash, but instead returns a new hash.

Hash#updateSync(data): Hash

Updates the hash with the given data buffer. Does not modify the current hash, but instead returns a new hash.

Hash#digest(): Promise<Buffer>

Computes the digest of the hash. Returns a buffer that can be converted to hexadecimal, etc. using Buffer#toString(). Does not modify the original hash.

Hash#digestSync(): Buffer

Computes the digest of the hash. Returns a buffer that can be converted to hexadecimal, etc. using Buffer#toString(). Does not modify the original hash.

Hash#serialize(): Buffer

Serializes the hash state into a buffer and returns it. The returned buffer can be used in another call to new Hash to resume the hashing.

Performance

resumable-hash has a fully asynchronous API and performs hashing in a background thread to not block the main event loop. It is built for cases where a server performs stream hashing as part of answering requests, but also serves other requests which don't require hashing. With the built-in Node.js hashing, the hashing requests prevent the server from answering all other requests, driving up latency.

To simulate this scenario, a synthetic server was created which supports three endpoints: / which just serves a simple JSON response body, and /sync and /async which perform synchronous hashing (via the built-in crypto module) and asynchronous hashing (via resumable-hash), respectively.

As a benchmark, both / and /sync and / and /async were hit repeatedly and the latency for the / endpoint was measured. Below are the results, performed on a 2,3 GHz Intel Core i7 MacBook Pro:

Synchronous hashing (built-in crypto):

Running 30s test @ http://localhost:12345/
  2 threads and 10 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency    20.69ms    4.11ms  51.36ms   95.61%
    Req/Sec   242.66     20.28   303.00     79.70%
  14550 requests in 30.10s, 1.85MB read
Requests/sec:    483.37
Transfer/sec:     62.78KB

Asynchronous hashing (resumable-hash):

Running 30s test @ http://localhost:12345/
  2 threads and 10 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency     1.07ms  673.30us  22.89ms   93.31%
    Req/Sec     4.89k   693.44    10.41k    74.54%
  292541 requests in 30.10s, 37.11MB read
Requests/sec:   9717.74
Transfer/sec:      1.23MB
0.2.5

4 years ago

0.2.4

6 years ago

0.2.3

6 years ago

0.2.2

7 years ago

0.2.1

7 years ago

0.2.0

7 years ago

0.1.7

8 years ago

0.1.6

8 years ago

0.1.5

8 years ago

0.1.4

8 years ago

0.1.3

8 years ago

0.1.2

8 years ago

0.1.1

8 years ago

0.1.0

8 years ago

0.0.1

8 years ago