UNPKG

luhn-generator

Version:

A generator of numbers that passes the validation of Luhn algorithm or Luhn formula, also known as the 'modulus 10' or 'mod 10' algorithm

58 lines (45 loc) 1.62 kB
var bytesToUuid = require('./bytesToUuid'); function uuidToBytes(uuid) { // Note: We assume we're being passed a valid uuid string var bytes = []; uuid.replace(/[a-fA-F0-9]{2}/g, function(hex) { bytes.push(parseInt(hex, 16)); }); return bytes; } function stringToBytes(str) { str = unescape(encodeURIComponent(str)); // UTF8 escape var bytes = new Array(str.length); for (var i = 0; i < str.length; i++) { bytes[i] = str.charCodeAt(i); } return bytes; } module.exports = function(name, version, hashfunc) { var generateUUID = function(value, namespace, buf, offset) { var off = buf && offset || 0; if (typeof(value) == 'string') value = stringToBytes(value); if (typeof(namespace) == 'string') namespace = uuidToBytes(namespace); if (!Array.isArray(value)) throw TypeError('value must be an array of bytes'); if (!Array.isArray(namespace) || namespace.length !== 16) throw TypeError('namespace must be uuid string or an Array of 16 byte values'); // Per 4.3 var bytes = hashfunc(namespace.concat(value)); bytes[6] = (bytes[6] & 0x0f) | version; bytes[8] = (bytes[8] & 0x3f) | 0x80; if (buf) { for (var idx = 0; idx < 16; ++idx) { buf[off+idx] = bytes[idx]; } } return buf || bytesToUuid(bytes); }; // Function#name is not settable on some platforms (#270) try { generateUUID.name = name; } catch (err) { } // Pre-defined namespaces, per Appendix C generateUUID.DNS = '6ba7b810-9dad-11d1-80b4-00c04fd430c8'; generateUUID.URL = '6ba7b811-9dad-11d1-80b4-00c04fd430c8'; return generateUUID; };