blob: eddc45b6b47d2efdeb8056424c50891f537c82ad [file] [edit]
// Copyright (c) 2026, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
import 'dart:math';
import 'dart:typed_data';
/// A UUID generator.
///
/// This is a lightweight replacement for package:uuid, specifically for
/// generating version 4 (random) UUIDs using a cryptographically secure random
/// number generator.
///
/// See https://datatracker.ietf.org/doc/html/rfc4122#section-4.4
/// See also https://github.com/daegalus/dart-uuid/blob/main/lib/v4.dart
class Uuid {
static final Random _random = Random.secure();
const Uuid();
/// Generates a Version 4 (random) UUID.
///
/// The UUID is formatted as a string:
/// xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx
/// where x is a random hex digit and y is a random hex digit from 8, 9, a,
/// or b.
String v4() {
final bytes = Uint8List(16);
for (var i = 0; i < 16; i++) {
bytes[i] = _random.nextInt(256);
}
// Set the version number (4) to 0100
bytes[6] = (bytes[6] & 0x0f) | 0x40;
// Set the variant (10xx) to 1000
bytes[8] = (bytes[8] & 0x3f) | 0x80;
final buf = StringBuffer();
for (var i = 0; i < 16; i++) {
if (i == 4 || i == 6 || i == 8 || i == 10) {
buf.write('-');
}
buf.write(_hex[bytes[i]]);
}
return buf.toString();
}
/// A pre-computed list of hex strings for all possible byte values (0-255).
///
/// For example, `_hex[255]` is 'ff'.
static final _hex = List.generate(
256,
(i) => i.toRadixString(16).padLeft(2, '0'),
);
}