docs: public String get() {
  		synchronized (LOCK) {
  			if (!initialised) {
  				// generate the random number
  				Random rnd = new Random();	// @todo need a different seed, this is now time based and I
  				// would prefer something different, like an object address
  				// get the random number, instead of getting an integer and converting that to base64 later,
  				// we get a string and narrow that down to base64, use the top 6 bits of the characters
  				// as they are more random than the bottom ones...
  				rnd.nextBytes(value);		// get some random characters
  				value[3] = BASE64[((value[3] >> 2) & BITS_6)]; // NOSONAR
  				value[4] = BASE64[((value[4] >> 2) & BITS_6)]; // NOSONAR
  				value[5] = BASE64[((value[5] >> 2) & BITS_6)]; // NOSONAR
  				value[6] = BASE64[((value[6] >> 2) & BITS_6)]; // NOSONAR
  				value[7] = BASE64[((value[7] >> 2) & BITS_6)]; // NOSONAR
  
  				// complete the time part in the HIGH value of the token
  				// this also sets the initial low value
  				completeToken(rnd);
  
  				initialised = true;
  			}
  
  			// fill in LOW value in id
  			int l = low;
  			value[0] = BASE64[(l & BITS_6)];
  			l >>= SHIFT_6;
  			value[1] = BASE64[(l & BITS_6)];
  			l >>= SHIFT_6;
  			value[2] = BASE64[(l & BITS_6)];
  
  			String res = new String(value);
  
  			// increment LOW
  			low++;
  			if (low == LOW_MAX) {
  				low = 0;
  			}
  			if (low == lowLast) {
  				time = System.currentTimeMillis();
  				completeToken();
  			}
  
  			return res;
  		}
  	}