Laravel UUID 及其独特性?

Ash*_*own 4 php uuid laravel laravel-5

我有两个表,一个用于存储lists,另一个用于存储history创建lists的表。这些lists都是非常临时的,可以通过多种方法删除它们,因此我reason在历史记录中添加了一个字段。

//Lists table
Schema::create('lists', function (Blueprint $table) {
  $table->increments('id');
  $table->string('name');
  $table->text('message');
  $table->uuid('uuid');
  $table->timestamps();
});

//History table
Schema::create('history', function (Blueprint $table) {
  $table->increments('id');
  $table->string('name');
  $table->text('message');
  $table->string('reason');
  $table->uuid('uuid');
  $table->timestamps();
});
Run Code Online (Sandbox Code Playgroud)

现在两者都有一个uuid字段,我可以生成一个实际的字符串来使用 Laravel 的辅助函数进行存储$uuid = (string) Str::uuid();

$list = new List;
$list->name = 'A basic fact of life';
$list->message = 'Pineapple does not belong on pizza.'
$uuid = (string) Str::uuid();
$list->uuid = $uuid;
$list->save();
Run Code Online (Sandbox Code Playgroud)

现在,当我成功地从 中删除一条记录时Lists,我还会在历史记录中创建一条新记录及其数据。

$list = find($id);
$destroy = List::destroy($id);
if($destroy) {
  $history = new History;
  $history->name = $list->name;
  $history->message $list->message;
  $history->uuid = $list->uuid;
  $history->reason = 'some reason';
  $history->save();
}
Run Code Online (Sandbox Code Playgroud)

所以我的问题是,Laravel 如何知道我生成的下一个 UUID 实际上是唯一的?

所谓的重复问题链接实际上并没有说明它如何或是否知道下一个 UUID 实际上对于过去创建的 UUID 来说是唯一的,而是给出了一个概率。

bis*_*hop 12

Laravel 实现了UUID v4,由RFC 4122定义为唯一的。RFC 声明(强调我的):

标识符唯一性注意事项:
本文档指定了三种生成 UUID 的算法:第一种利用 802 MAC 地址的唯一值来保证唯一性,第二种使用伪随机数生成器,第三种使用加密哈希和应用程序提供的文本字符串。因此,根据此处的机制生成的 UUID 将与已分配或将要分配的所有其他 UUID 不同。

Laravel 不太“知道”它是唯一的,而是“信任”它是因为该算法被定义为相对于该算法生成的所有其他算法而言是唯一的。

这里有一个重要的警告。该算法需要足够的熵源来保证人们普遍引用的说法,即在接下来的 100 年里,你需要每天创造数万亿个熵,才有 50/50 的机会被骗。为此,Laravel 依靠ramsey/uuid来进行实际的 v4 生成。长话短说,ramsey/uuid 使用random_bytes来表示其熵。这是一个加密性强的来源,足以符合 RFC 生成 v4 的资格。现在重要的部分:

如果上述来源均不可用,则会抛出异常。

因此,当您的代码(string)Str::uuid()无法生成真正随机的全局唯一值时,您的代码将抛出异常。