38 lines
1.0 KiB
JavaScript
38 lines
1.0 KiB
JavaScript
/* jslint node: true */
|
|
'use strict';
|
|
|
|
const createHash = require('crypto').createHash;
|
|
|
|
exports.createNamedUUID = createNamedUUID;
|
|
|
|
function createNamedUUID(namespaceUuid, key) {
|
|
//
|
|
// v5 UUID generation code based on the work here:
|
|
// https://github.com/download13/uuidv5/blob/master/uuid.js
|
|
//
|
|
if(!Buffer.isBuffer(namespaceUuid)) {
|
|
namespaceUuid = Buffer.from(namespaceUuid);
|
|
}
|
|
|
|
if(!Buffer.isBuffer(key)) {
|
|
key = Buffer.from(key);
|
|
}
|
|
|
|
let digest = createHash('sha1').update(
|
|
Buffer.concat( [ namespaceUuid, key ] )).digest();
|
|
|
|
let u = Buffer.alloc(16);
|
|
|
|
// bbbb - bb - bb - bb - bbbbbb
|
|
digest.copy(u, 0, 0, 4); // time_low
|
|
digest.copy(u, 4, 4, 6); // time_mid
|
|
digest.copy(u, 6, 6, 8); // time_hi_and_version
|
|
|
|
u[6] = (u[6] & 0x0f) | 0x50; // version, 4 most significant bits are set to version 5 (0101)
|
|
u[8] = (digest[8] & 0x3f) | 0x80; // clock_seq_hi_and_reserved, 2msb are set to 10
|
|
u[9] = digest[9];
|
|
|
|
digest.copy(u, 10, 10, 16);
|
|
|
|
return u;
|
|
} |