generate method
Generates UUID for current time
Implementation
Uuid generate() {
final elapsedIntervals = _sw.elapsedTicks ~/ _ticksPerInterval;
final diff = elapsedIntervals - _lastElapsedIntervals;
// print(' elapsedIntervals : $elapsedIntervals');
// print(' _lastElapsedIntervals : $_lastElapsedIntervals');
_lastElapsedIntervals = elapsedIntervals;
if (diff == 0) {
// account for low res clocks
// same interval, bump extra intervals counter
_extraIntervals++;
if (_extraIntervals > _intervalsPerMs) {
throw StateError('Too many UUIDs requested');
}
} else {
_extraIntervals = 0;
if (diff < 0) {
// clock regression, bump clock sequence
_clockSeq++;
_clockSeq &= 0x3FFF;
}
}
final elapsedMs = elapsedIntervals ~/ _intervalsPerMs;
final msIntervals =
(elapsedIntervals - elapsedMs * _intervalsPerMs) + _extraIntervals;
// print(' elapsedMs : $elapsedMs');
// print(' msIntervals : $msIntervals');
// print(' _extraIntervals : $_extraIntervals');
int ts, timeLo, timeMidHi;
if ((1 << 32) != 0) {
ts = (_zeroMs + elapsedMs) * _intervalsPerMs + msIntervals;
timeLo = ts & 0xFFFFFFFF;
timeMidHi = ts >> 32;
} else {
ts = _zeroMs + elapsedMs;
timeLo = ((ts & 0xfffffff) * _intervalsPerMs + msIntervals) % 0x100000000;
timeMidHi = (ts ~/ 0x100000000 * _intervalsPerMs) & 0xfffffff;
// print(' ts : $ts');
// print(' timeLo : $timeLo');
// print(' timeMidHi : $timeMidHi');
}
_buffer[0] = timeLo >> 24;
_buffer[1] = timeLo >> 16;
_buffer[2] = timeLo >> 8;
_buffer[3] = timeLo;
_buffer[4] = timeMidHi >> 8;
_buffer[5] = timeMidHi;
_buffer[6] = ((timeMidHi >> 24) & 0x0F) | 0x10; // version 1
_buffer[7] = timeMidHi >> 16;
_buffer[8] = ((_clockSeq >> 8) & 0x3F) | 0x80; // variant 1
_buffer[9] = _clockSeq;
// bytes (10-15) are already set with NodeId bytes
return Uuid.fromBytes(_buffer);
}