UUID.generate constructor

UUID.generate(
  1. int version, {
  2. List<Object>? parameters,
})

Factory method to generate UUID of the specific version.

Implementation

factory UUID.generate(int version, {List<Object>? parameters}) {
  List<Object> params = [];
  if (parameters == null) {
    if (version != 4 && version != 0) {
      return UUID.generate(4);
    }
  } else {
    params = parameters;
  }
  switch (version) {
    case 0:
      {
        ByteLayer layer = ByteLayer();
        layer.writeLong(0);
        layer.writeLong(0);

        layer.resetPosition();

        return UUID(layer.readBytes(16));
      }
    case 3:
      {
        if (params.length != 2) {
          throw Exception(
              "UUID v3 requires two parameters, [namespace,name]");
        }
        String namespace = params[0] as String;
        String name = params[1] as String;

        ByteLayer layer = ByteLayer();

        final namespaceBytes = utf8.encode(namespace);
        layer.writeBytes(namespaceBytes);
        final nameBytes = utf8.encode(name);
        layer.writeBytes(nameBytes);

        var bytes = md5.convert(List.from(layer.bytes)).bytes;
        layer.clear();
        layer.writeBytes(bytes);

        layer.unsetSetBit(6, 0xF0, 0x30);
        layer.unsetSetBit(8, 0xC0, 0x80);

        layer.resetPosition();
        return UUID(layer.readBytes(16));
      }
    case 4:
      {
        ByteLayer layer = ByteLayer();
        final random = Random.secure();

        layer.insertRandomBytes(16);

        layer.unsetSetBit(6, 0xF0, 0x40);
        layer.unsetSetBit(8, 0xC0, 0x80);

        layer.resetPosition();

        return UUID(layer.readBytes(16));
      }
    case 5:
      {
        ByteLayer layer = ByteLayer();
        if (params.length != 2) {
          throw Exception(
              "UUID v5 requires two parameters, [namespace,name]");
        }
        String namespace = params[0] as String;
        String name = params[1] as String;

        if (namespace.isNotEmpty) {
          final namespaceBytes = utf8.encode(namespace);
          layer.writeBytes(namespaceBytes);
        }

        if (name.isNotEmpty) {
          final nameBytes = utf8.encode(name);
          layer.writeBytes(nameBytes);
        }

        final hashBytes = sha1.convert(List.from(layer.bytes)).bytes;
        layer.clear();
        layer.writeBytes(hashBytes);

        layer.unsetSetBit(6, 0xF0, 0x50);
        layer.unsetSetBit(8, 0xC0, 0x80);

        layer.resetPosition();

        return UUID(layer.readBytes(16));
      }
    default:
      throw ArgumentError('Unsupported UUID version: $version');
  }
}