Skip to content

AndreasGassmann/lifehash

Repository files navigation

LifeHash

Build code style: prettier npm

TypeScript/JavaScript implementation of LifeHash: A visual hash algorithm.

"Hello, world!"

version1 version2 detailed fiducial grayscale_fiducial

version1  •  version2  •  detailed  •  fiducial  •  grayscale

Description

LifeHash is a method of hash visualization based on Conway's Game of Life that creates beautiful icons that are deterministic, yet distinct and unique given the input data.

The basic concept is to take a SHA-256 hash of the input data (which can be any data including another hash) and then use the 256-bit digest as a 16x16 pixel "seed" for running the cellular automata known as Conway's Game of Life.

After the pattern becomes stable (or begins repeating) the resulting history is used to compile a grayscale image of all the states from the first to last generation. Using Game of Life provides visual structure to the resulting image, even though it was seeded with entropy.

Some bits of the initial hash are then used to deterministically apply symmetry and color to the icon to add beauty and quick recognizability.

Source: https://lifehash.info/

Versions

All five LifeHash versions are supported:

Version Grid Output Description
version1 16x16 32x32 Original version, HSB color gamut
version2 16x16 32x32 CMYK-safe colors (default, recommended)
detailed 32x32 64x64 Higher resolution
fiducial 32x32 32x32 No symmetry, for machine vision
grayscale_fiducial 32x32 32x32 Grayscale, no symmetry

Output is verified pixel-for-pixel against the reference C++ implementation test vectors.

Installation

npm install lifehash

Example

import { LifeHash, LifeHashVersion } from 'lifehash';

const image = LifeHash.makeFrom('Hello, world!', LifeHashVersion.version2, 1, true);

image.toDataUrl(); // data:image/png;base64,...

For more examples, check the examples folder or the tests.

Documentation

This library exports one class called LifeHash.

LifeHash

class LifeHash {
  static makeFrom(
    data: string | Uint8Array,
    version = LifeHashVersion.version2,
    module_size = 1,
    has_alpha = false,
  ): Image { /* */ }

  static makeFromDigest(
    digest: Uint8Array,
    version = LifeHashVersion.version2,
    module_size = 1,
    has_alpha = false,
  ): Image { /* */ }
}

Testing

npm install
npm test

Test vectors are sourced from the reference implementation.

Dependencies

There is only 1 (non-dev) dependency:

Usages

Currently, the following wallets support LifeHash:

Credits

The project setup has been inspired by multiple bitcoinjs libraries, such as bip39 and bip85.

Original C++ implementation: https://github.com/BlockchainCommons/bc-lifehash

This implementation is heavily inspired by https://github.com/BlockchainCommons/bc-lifehash-python

LICENSE

MIT

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Contributors