Laravel UUID及其唯一性?

时间:2018-10-11 02:51:37

标签: php laravel laravel-5 uuid

我有两个表,一个表用于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();
});

现在两者都有一个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();

现在,当我成功从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();
}

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

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

2 个答案:

答案 0 :(得分:1)

  

UUID是“通用唯一标识符”的缩写,是36个一组   包含字母和数字的字符。每一套都应该是唯一的   每100年只有一次重复的机会,   详细了解它,并查看一些不错的统计信息here,并   here

来源: What is a UUID

答案 1 :(得分:1)

Laravel实现UUID v4,由RFC 4122定义为唯一。 RFC声明(重点是我的):

  

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

Laravel并不是很“了解”它的唯一性,而是“信任”,这是因为该算法相对于该算法所产生的所有其他特征都被定义为唯一。 >

这里有一个重要的警告。该算法需要足够的熵源来保证commonly cited claim,在接下来的100年中,您每天需要创造数万亿美元才能有50/50的被骗机会。为此,Laravel依靠ramsey/uuid进行了实际的v4生成。 ramsey/uuid uses,长话短说,random_bytes具有熵。这是一个强大的加密源,足以根据RFC进行v4生成。现在重要的部分:

  

如果上述来源均不可用,则将引发异常。

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