Comparing version 0.0.0 to 0.0.1
{ | ||
"name": "uuidv5", | ||
"version": "0.0.0", | ||
"version": "0.0.1", | ||
"description": "Generates named version 5 UUIDs", | ||
@@ -26,4 +26,4 @@ "main": "uuid.js", | ||
"devDependencies": { | ||
"mocha": "^1.21.4" | ||
"mocha": "3.1.2" | ||
} | ||
} |
@@ -10,3 +10,3 @@ # UUIDv5 | ||
`var createUUIDv5 = require('uuidv5');` | ||
`var uuidv5 = require('uuidv5');` | ||
@@ -18,13 +18,13 @@ If you are unfamiliar with v5 UUIDs, read [this](http://en.wikipedia.org/wiki/Universally_unique_identifier#Version_5_.28SHA-1_hash.29). For a deeper look, read [RFC 4122](http://tools.ietf.org/html/rfc4122). | ||
### createUUIDv5(namespace, name, [raw_output]) | ||
### uuidv5(namespace, name, [raw_output]) | ||
* `namespace` can be 'url', 'dns', 'oid', or 'x500'. If it's none of those, it must be a UUID to use as a namespace, either in string or Buffer form. | ||
* `namespace` can be 'url', 'dns', 'oid', 'x500', or 'null'. If it's none of those, it must be a UUID to use as a namespace, either in string or Buffer form. | ||
* `name` can be a string or Buffer. What it should contain is namespace-dependent. | ||
* `raw_output` is an optional flag. If set to `true`, the UUID will be returned as a Buffer instead of as a string. | ||
### createUUIDv5.uuidToString(uuid) | ||
### uuidv5.uuidToString(uuid) | ||
Takes a Buffer-form uuid and returns it as a string. | ||
### createUUIDv5.uuidFromString(uuidStr) | ||
### uuidv5.uuidFromString(uuidStr) | ||
@@ -37,13 +37,13 @@ Takes a UUID as a string (with or without dashes [-]) and returns it as a Buffer. | ||
```javascript | ||
var createUUIDv5 = require('uuidv5'); | ||
var uuidv5 = require('uuidv5'); | ||
// Generate a UUID in the default URL namespace | ||
var urlUUID = createUUIDv5('url', 'http://google.com/page'); | ||
var urlUUID = uuidv5('url', 'http://google.com/page'); | ||
// Default DNS namespace | ||
var dnsUUID = createUUIDv5('dns', 'google.com'); | ||
var dnsUUID = uuidv5('dns', 'google.com'); | ||
// Create your own namespace | ||
var privns = createUUIDv5('null', 'my-private-namespace', true); // Buffer form is more efficient | ||
var privUUID = createUUIDv5(privns, 'some-named-thing'); | ||
var privns = uuidv5('null', 'my-private-namespace', true); // Buffer form is more efficient | ||
var privUUID = uuidv5(privns, 'some-named-thing'); | ||
``` |
41
test.js
@@ -1,14 +0,26 @@ | ||
var assert = require('assert'); | ||
var uuidv5 = require('./uuid'); | ||
const assert = require('assert'); | ||
const uuidv5 = require('./uuid'); | ||
describe('UUIDv5', function() { | ||
it('makes DNS uuids', function() { | ||
var r = uuidv5('dns', 'www.example.org'); | ||
describe('UUIDv5', () => { | ||
it('converts strings to uuids', () => { | ||
const bin = uuidv5.uuidFromString('74738ff5-5367-5958-9aee-98fffdcd1876'); | ||
assert(bin.equals(Buffer.from('74738ff5536759589aee98fffdcd1876', 'hex'))); | ||
}); | ||
it('converts uuids to strings', () => { | ||
const str = uuidv5.uuidToString(uuidv5.uuidFromString('74738ff5-5367-5958-9aee-98fffdcd1876')); | ||
assert.equal(str, '74738ff5-5367-5958-9aee-98fffdcd1876'); | ||
}); | ||
it('makes DNS uuids', () => { | ||
const r = uuidv5('dns', 'www.example.org'); | ||
assert.equal(r, '74738ff5-5367-5958-9aee-98fffdcd1876'); | ||
}); | ||
it('makes URL uuids', function() { | ||
var r = uuidv5('url', 'http://example.org/page'); | ||
it('makes URL uuids', () => { | ||
const r = uuidv5('url', 'http://example.org/page'); | ||
@@ -18,4 +30,4 @@ assert.equal(r, '6b19973b-8154-5782-bca0-15e6b730ca00'); | ||
it('makes OID uuids', function() { | ||
var r = uuidv5('oid', '1.3.6.1.2.1'); | ||
it('makes OID uuids', () => { | ||
const r = uuidv5('oid', '1.3.6.1.2.1'); | ||
@@ -25,7 +37,14 @@ assert.equal(r, '2a7086de-bbf9-5cb9-9a66-a9e928c26504'); | ||
it('makes X.500 uuids', function() { | ||
var r = uuidv5('oid', 'uid=user,ou=people,dc=example,dc=com'); | ||
it('makes X.500 uuids', () => { | ||
const r = uuidv5('oid', 'uid=user,ou=people,dc=example,dc=com'); | ||
assert.equal(r, '075749ab-61eb-54ec-807d-863ebd6f271a'); | ||
}); | ||
it('can return a Buffer', () => { | ||
const r = uuidv5('url', 'http://example.org/page', true); | ||
const compare = uuidv5.uuidFromString('6b19973b-8154-5782-bca0-15e6b730ca00'); | ||
assert.deepEqual(r.toJSON(), compare.toJSON()); | ||
}); | ||
}); |
91
uuid.js
@@ -1,16 +0,16 @@ | ||
var crypto = require('crypto'); | ||
const crypto = require('crypto'); | ||
var NAMESPACE_DNS = uuidFromString('6ba7b810-9dad-11d1-80b4-00c04fd430c8'); | ||
var NAMESPACE_URL = uuidFromString('6ba7b811-9dad-11d1-80b4-00c04fd430c8'); | ||
var NAMESPACE_OID = uuidFromString('6ba7b812-9dad-11d1-80b4-00c04fd430c8'); | ||
var NAMESPACE_X500 = uuidFromString('6ba7b814-9dad-11d1-80b4-00c04fd430c8'); | ||
var NAMESPACE_NULL = uuidFromString('00000000-0000-0000-0000-000000000000'); | ||
const NAMESPACE_DNS = uuidFromString('6ba7b810-9dad-11d1-80b4-00c04fd430c8'); | ||
const NAMESPACE_URL = uuidFromString('6ba7b811-9dad-11d1-80b4-00c04fd430c8'); | ||
const NAMESPACE_OID = uuidFromString('6ba7b812-9dad-11d1-80b4-00c04fd430c8'); | ||
const NAMESPACE_X500 = uuidFromString('6ba7b814-9dad-11d1-80b4-00c04fd430c8'); | ||
const NAMESPACE_NULL = uuidFromString('00000000-0000-0000-0000-000000000000'); | ||
// TODO: Add named default namespaces | ||
function createUUIDv5Binary(namespace, name) { | ||
var c = Buffer.concat([namespace, name], namespace.length + name.length); | ||
const c = Buffer.concat([namespace, name], namespace.length + name.length); | ||
var digest = crypto.createHash('sha1').update(c).digest(); | ||
var uuid = new Buffer(16); | ||
const digest = crypto.createHash('sha1').update(c).digest(); | ||
const uuid = new Buffer(16); | ||
@@ -38,19 +38,33 @@ // bbbb - bb - bb - bb - bbbbbb | ||
var raw = ''; | ||
let raw = ''; | ||
for(var i = 0; i < 16; i++) { | ||
var n = uuid[i].toString(16); | ||
if(n.length < 2) n = '0' + n; | ||
raw += n; | ||
for(let i = 0; i < 16; i++) { | ||
raw += byteToHex(uuid[i]).toString(16); | ||
} | ||
var r = raw.substr(0, 8) | ||
+ '-' + raw.substr(8, 4) | ||
+ '-' + raw.substr(12, 4) | ||
+ '-' + raw.substr(16, 4) | ||
+ '-' + raw.substr(20); | ||
return formatUUIDString(raw); | ||
} | ||
return r.toLowerCase(); | ||
function byteToHex(n) { | ||
const str = n.toString(16); | ||
if(str.length === 1) { | ||
return '0' + str; | ||
} | ||
return str; | ||
} | ||
function formatUUIDString(uuidStr) { | ||
const segments = [ | ||
uuidStr.substr(0, 8), | ||
uuidStr.substr(8, 4), | ||
uuidStr.substr(12, 4), | ||
uuidStr.substr(16, 4), | ||
uuidStr.substr(20) | ||
]; | ||
return segments.join('-').toLowerCase(); | ||
} | ||
function uuidFromString(uuid) { | ||
@@ -61,3 +75,3 @@ if(typeof uuid !== 'string') { | ||
var raw = uuid.replace(/-/g, ''); | ||
const raw = uuid.replace(/-/g, ''); | ||
if(raw.length !== 32) { | ||
@@ -67,5 +81,5 @@ throw new Error('uuid string length must be 32 with -\'s removed'); | ||
var octets = []; | ||
const octets = []; | ||
for(var i = 0; i < 16; i++) { | ||
for(let i = 0; i < 16; i++) { | ||
octets[i] = parseInt(raw.substr(i * 2, 2), 16); | ||
@@ -77,31 +91,32 @@ } | ||
function createUUIDv5(namespace, name, binary) { | ||
function getNamespace(namespace) { | ||
if(!Buffer.isBuffer(namespace)) { | ||
switch(namespace) { // Default namespaces | ||
switch(namespace.toLowerCase()) { // Default namespaces | ||
case 'dns': | ||
namespace = NAMESPACE_DNS; | ||
break; | ||
return NAMESPACE_DNS; | ||
case 'url': | ||
namespace = NAMESPACE_URL; | ||
break; | ||
return NAMESPACE_URL; | ||
case 'oid': | ||
namespace = NAMESPACE_OID; | ||
break; | ||
return NAMESPACE_OID; | ||
case 'x500': | ||
namespace = NAMESPACE_X500; | ||
break; | ||
return NAMESPACE_X500; | ||
case 'null': | ||
case null: | ||
namespace = NAMESPACE_NULL; | ||
break; | ||
return NAMESPACE_NULL; | ||
default: | ||
namespace = uuidFromString(namespace); | ||
return uuidFromString(namespace); | ||
} | ||
} | ||
return namespace; | ||
} | ||
function createUUIDv5(namespace, name, binary) { | ||
namespace = getNamespace(namespace); | ||
if(!Buffer.isBuffer(name)) { | ||
@@ -111,3 +126,3 @@ name = new Buffer(name, 'utf8'); | ||
var uuid = createUUIDv5Binary(namespace, name); | ||
let uuid = createUUIDv5Binary(namespace, name); | ||
if(!binary) { | ||
@@ -114,0 +129,0 @@ uuid = uuidToString(uuid); |
6180
131