comb-uuid
Version:
Implements COMB UUIDs (UUID v4 Variant B) which sort to chronological order.
66 lines (48 loc) • 1.74 kB
JavaScript
;
const crypto = require('crypto');
class CombUUID {
static encode(now = new Date()) {
if (!(now instanceof Date)) {
now = new Date(now);
}
// timestamp
const timestamp_js = now.getTime();
const timestamp_bin = timestamp_js * 100;
const timestamp_hex = timestamp_bin.toString(16);
const ts1 = timestamp_hex.substring(0, 8);
const ts2 = timestamp_hex.substring(8, 13);
// version
const version = '4';
const variant = 'b';
// random
const bytes = crypto.randomBytes(18).toString("hex");
const r1 = bytes.substring(0,3);
const r2 = bytes.substring(3,6);
const r3 = bytes.substring(6,18);
return `${ts1}-${ts2}-${version}${r1}-${variant}${r2}-${r3}`;
}
static decode(uuid) {
const uuid_hex = `${uuid}`.toLowerCase().replace(/[^0-9a-f]/g, ''); // string all non-hex characters
if (uuid_hex.length !== 32) {
throw new Error('Invalid UUID not length 32 when non-hex characters removed');
}
// timestamp
const timestamp_hex = uuid_hex.substring(0, 12);
const timestamp = parseInt(timestamp_hex, 16);
const timestamp_ms = timestamp / 100;
const timestamp_js = new Date(timestamp_ms);
// version
const version = uuid_hex.substring(12, 13);
const variant = uuid_hex.substring(16, 17);
// random
const random = `${uuid_hex.substring(13,16)}${uuid_hex.substring(17)}`;
return {
version,
variant,
timestamp,
timestamp_js,
random,
};
}
}
module.exports = CombUUID;