docs: @Override
      public String generateId() {
          StringBuilder sb = new StringBuilder();
  
          int bitsLeft = bitsPerId;
          while (bitsLeft > 0) {
              long random = ThreadLocalRandom.current().nextLong();
  
              if (bitsLeft < BITS_PER_LONG) {
                  random >>>= (BITS_PER_LONG - bitsLeft);
              }
  
              encode(random, sb);
  
              bitsLeft -= BITS_PER_LONG;
          }
  
          while (sb.length() < encodedIdLength) {
              sb.append(characters[0]);
          }
  
          // It's possible we could generate a string larger than we expect.  Cut it down if needed.
          return sb.length() == encodedIdLength ? sb.toString() : sb.substring(0, encodedIdLength);
      }