UUID.generate constructor
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');
}
}