Skip to content

Instantly share code, notes, and snippets.

@andrewrk
Created January 1, 2013 08:02
Show Gist options
  • Star 8 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save andrewrk/4425843 to your computer and use it in GitHub Desktop.
Save andrewrk/4425843 to your computer and use it in GitHub Desktop.
how to generate minecraft hex digests
var crypto = require('crypto');
var assert = require('assert');
function mcHexDigest(str) {
var hash = new Buffer(crypto.createHash('sha1').update(str).digest(), 'binary');
// check for negative hashes
var negative = hash.readInt8(0) < 0;
if (negative) performTwosCompliment(hash);
var digest = hash.toString('hex');
// trim leading zeroes
digest = digest.replace(/^0+/g, '');
if (negative) digest = '-' + digest;
return digest;
}
function performTwosCompliment(buffer) {
var carry = true;
var i, newByte, value;
for (i = buffer.length - 1; i >= 0; --i) {
value = buffer.readUInt8(i);
newByte = ~value & 0xff;
if (carry) {
carry = newByte === 0xff;
buffer.writeUInt8(newByte + 1, i);
} else {
buffer.writeUInt8(newByte, i);
}
}
}
assert.strictEqual(mcHexDigest('Notch'), "4ed1f46bbe04bc756bcb17c0c7ce3e4632f06a48");
assert.strictEqual(mcHexDigest('jeb_'), "-7c9d5b0044c130109a5d7b5fb5c317c02b4e28c1");
assert.strictEqual(mcHexDigest('simon'), "88e16a1019277b15d58faf0541e11910eb756f6");
@janispritzkau
Copy link

janispritzkau commented Nov 3, 2022

This is much simpler using modern javascript:

function hexDigest(text) {
  const hash = crypto.createHash("sha1")
    .update(text)
    .digest()

  return BigInt.asIntN( // performs two's compliment
    160,           // hash size in bits
    hash.reduce(   // convert buffer to bigint using reduce
      (a, x) =>
        a << 8n |  // bit-shift the accumulator 8 bits (one byte) to the left
        BigInt(x), // fill lower byte just freed up by bit-shifting using bitwise or-operator
      0n           // start with accumulator value of 0
    )
  ).toString(16)   // display the result with base 16 (hex)
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment