1 |
|
2 |
|
3 | var Crypto = require('crypto');
|
4 |
|
5 |
|
6 |
|
7 |
|
8 | var internals = {};
|
9 |
|
10 |
|
11 |
|
12 |
|
13 | internals.byteToHex = [];
|
14 |
|
15 |
|
16 | internals.buildCache = function () {
|
17 |
|
18 | for (var i = 0; i < 256; ++i) {
|
19 | var hex = (i < 16 ? '0' : '') + i.toString(16);
|
20 | internals.byteToHex[i] = hex;
|
21 | }
|
22 | };
|
23 |
|
24 | internals.buildCache();
|
25 |
|
26 |
|
27 | exports.generate = function () {
|
28 |
|
29 | var rand = Crypto.randomBytes(10);
|
30 |
|
31 | rand[6] = (rand[6] & 0x0f) | 0x40;
|
32 | rand[8] = (rand[8] & 0x3f) | 0x80;
|
33 |
|
34 | var b = internals.byteToHex;
|
35 | var id = b[rand[0]] + b[rand[1]] + b[rand[2]] + b[rand[3]] + '-' +
|
36 | b[rand[4]] + b[rand[5]] + '-' +
|
37 | b[rand[6]] + b[rand[7]] + '-' +
|
38 | b[rand[8]] + b[rand[9]] + '-';
|
39 |
|
40 | var distributedRandom3B = function () {
|
41 |
|
42 | var bytes = '';
|
43 |
|
44 | while (!bytes) {
|
45 | var rand = Crypto.randomBytes(3);
|
46 | var value = (rand[0] << 16) | (rand[1] << 8) | rand[2];
|
47 | if (value >= 10000000) {
|
48 | continue;
|
49 | }
|
50 |
|
51 | bytes = internals.byteToHex[rand[0]] + internals.byteToHex[rand[1]] + internals.byteToHex[rand[2]];
|
52 | }
|
53 |
|
54 | return bytes;
|
55 | };
|
56 |
|
57 | id += distributedRandom3B();
|
58 | id += distributedRandom3B();
|
59 |
|
60 | return id;
|
61 | };
|
62 |
|
63 |
|
64 | exports.criteria = function (id) {
|
65 |
|
66 | if (!id.match(/^[0-9a-fA-F]{8}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{12}$/)) {
|
67 | return null;
|
68 | }
|
69 |
|
70 | var parse = function (from, to) {
|
71 |
|
72 | var hex = id.slice(from, to);
|
73 | var value = parseInt(hex, 16);
|
74 |
|
75 | if (value >= 10000000) {
|
76 | return null;
|
77 | }
|
78 |
|
79 | var set = value.toString().split('');
|
80 | for (var i = 0, il = set.length; i < il; ++i) {
|
81 | set[i] = parseInt(set[i], 10);
|
82 | }
|
83 |
|
84 | for (i = 0, il = 7 - set.length; i < il; ++i) {
|
85 | set.unshift(0);
|
86 | }
|
87 |
|
88 | return set;
|
89 | };
|
90 |
|
91 | var set1 = parse(24, 30);
|
92 | var set2 = parse(30);
|
93 |
|
94 | if (set1 === null ||
|
95 | set2 === null) {
|
96 |
|
97 | return null;
|
98 | }
|
99 |
|
100 | var criteria = {
|
101 | $id: id,
|
102 | random: {
|
103 | a: (set1[0] * 10) + set1[1] + 1,
|
104 | b: (set1[1] * 10) + set1[2] + 1,
|
105 | c: (set1[2] * 10) + set1[3] + 1,
|
106 | d: (set1[3] * 10) + set1[4] + 1,
|
107 | e: (set1[4] * 10) + set1[5] + 1,
|
108 | f: (set1[5] * 10) + set1[6] + 1,
|
109 | g: (set1[6] * 10) + set2[0] + 1,
|
110 | h: (set2[0] * 10) + set2[1] + 1,
|
111 | i: (set2[1] * 10) + set2[2] + 1,
|
112 | j: (set2[2] * 10) + set2[3] + 1,
|
113 | k: (set2[3] * 10) + set2[4] + 1,
|
114 | l: (set2[4] * 10) + set2[5] + 1,
|
115 | m: (set2[5] * 10) + set2[6] + 1,
|
116 | n: (set2[6] * 10) + set1[0] + 1
|
117 | }
|
118 | };
|
119 |
|
120 | return criteria;
|
121 | };
|
122 |
|
123 |
|