1 /++
2 UID (Unique IDentifier) generator
3 +/
4 module sily.uid;
5 
6 import std.datetime;
7 import std.format;
8 
9 import sily.math;
10 import sily.random;
11 
12 private ulong _inc = 0;
13 private ulong _seed = 0;
14 private const uint _uintMin = 1_000_000_000u;
15 private const ulong _ulongMin = 1_000_000_000_000_000_000_0u;
16 private const ulong _uidMask = 0x7FFFFFFFF;
17 
18 static this() {
19     seedUID(Clock.currTime.stdTime);
20 }
21 
22 /// Sets/Returns current seed
23 void seedUID(ulong seed) {
24     _seed = (((seed & _uidMask) + (seed >> 42 & _uidMask)) + seed + (~seed << 42));
25     // _seed = 123456789;
26 }
27 /// Ditto
28 ulong seedUID() {
29     return _seed;
30 }
31 
32 /// Skips N amount of UID's
33 void skipUID(size_t count = 1) {
34     _inc += count;
35 }
36 
37 /// Generates 32 bit uid
38 uint generateUID() {
39     uint _out = 0;
40     ulong _tmp = _uintMin + _seed + (_inc * 0x00_10_42_1F);
41     // 11_22_33_44 -> 22_44_11_33
42     _out += (_tmp & 0x00_00_00_FF) << 16;
43     _out += (_tmp & 0x00_00_FF_00) >> 8;
44     _out += (_tmp & 0x00_FF_00_00) << 8;
45     _out += (_tmp & 0xFF_00_00_00) >> 16;
46     if (_out < _uintMin) _out += _uintMin;
47     ++_inc;
48     return _out;
49 }
50 
51 /// Generates 64 bit uid
52 ulong generateLongUID() {
53     ulong _out = 0;
54     ulong _tmp = _uintMin + _seed + (_inc * 0x00_00_01_0C_20_10_42_1F);
55     // 11_22_33_44_55_66_77_88 -> // 22_44_11_88_66_77_55_33
56     _out += (_tmp & 0x00_00_00_00_00_00_00_FF) << 32;
57     _out += (_tmp & 0x00_00_00_00_00_00_FF_00) << 8;
58     _out += (_tmp & 0x00_00_00_00_00_FF_00_00) << 8;
59     _out += (_tmp & 0x00_00_00_00_FF_00_00_00) >> 16;
60     _out += (_tmp & 0x00_00_00_FF_00_00_00_00) << 16;
61     _out += (_tmp & 0x00_00_FF_00_00_00_00_00) >> 40;
62     _out += (_tmp & 0x00_FF_00_00_00_00_00_00) << 8;
63     _out += (_tmp & 0xFF_00_00_00_00_00_00_00) >> 16;
64     if (_out < _uintMin) _out += _uintMin;
65     ++_inc;
66     return _out;
67 }
68 
69 /// Returns hex string of 32 bit uid (8 letters)
70 string genStringUID() {
71     return format("%x", generateUID());
72 }
73 
74 /// Returns hex string of 64 bit uid (16 letters)
75 string genLongStringUID() {
76     return format("%x", generateLongUID());
77 }
78