Generating a variable length hash with node

planted on in: Node JS.

I wanted to generate a unique hash of a given length for screenshot filenames and found Blake Miner's variableHash.js gist which is able to generate a variable-length hash of data.

Blakes version being 11 years old doesn't work with current Node (v19), there exists a newer version in the fork by @timargra which is only 5 years old, but that version causes "DeprecationWarning: Buffer() is deprecated" warnings.

Below is my version with admittedly minor changes required to get this function working under Node v19:

    const crypto = require('node:crypto');

// Initialization Vector
const IV = Buffer.from('068f7bb47896981d6c8b3f9a186591ae', 'hex');

* Generate a variable-length hash of `data`.
* Similar to the answer here:
* If you want a b-bit hash of the message m, then use the first b bits of AES-CTR(SHA256(m)).
* Rather than using the suggested algorithm in the stackexchange answer above, I developed
* my own.
* I decided to derive AES256 initialization vector and key from the output of SHA256(data).
* Then, the cipher is fed a zero-filled buffer as plaintext, which is encrypted using this key.
* The result should be a pseudorandom number generator seeded with a 256-bit hash of `data`.
* In other words, compute SHA256(m) and treat the resulting 256-bit string as a 256-bit AES key.
* Next, use AES in counter mode (with this key) to generate an unending stream of pseudorandom bits.
* Take the first b bits from this stream, and call it your hash.
* @author Blake Miner (bminer), timargra, Simon Dann (carbontwelve)
* @see
* @see
* @param {*} data
* @param {number} size
* @param {BufferEncoding} encoding
* @returns {string}

module.exports = (data, size = 5, encoding = 'hex') => {
let output = Buffer.alloc(size);
let hash = crypto.createHash('sha256');


let cipher = crypto.createCipheriv('aes256', hash.digest(), IV);
let offset = output.write(cipher.update(output).toString('binary'));
output.write('binary'), offset);
return output.toString(encoding);
— Blake Miner | link