generate method

Uuid generate()

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);
}