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