Laravel UUID и их уникальность? - PullRequest
0 голосов
/ 11 октября 2018

У меня есть две таблицы, одна для 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 фактически уникален для прошлых созданных, а скорее дает вероятность.

Ответы [ 2 ]

0 голосов
/ 11 октября 2018

Laravel реализует UUID v4 , определяемый RFC 4122 как уникальный.RFC заявляет (выделено мое):

Соображения уникальности идентификатора:
Этот документ определяет три алгоритма для генерации UUID: первый использует уникальные значения 802 MAC-адресов для гарантии уникальности, второй используетгенераторы псевдослучайных чисел, а третий использует криптографическое хеширование и предоставленные приложением текстовые строки.В результате идентификаторы UUID, сгенерированные в соответствии с представленными здесь механизмами, будут уникальными среди всех других идентификаторов UUID, которые были или будут назначены.

Laravel не так много "знает«что он уникален, а скорее« доверяет », это потому, что алгоритм определен как уникальный по отношению ко всем остальным, генерируемым этим алгоритмом .

Здесь есть важное предостережение.Алгоритм требует достаточного источника энтропии, чтобы гарантировать обычно цитируемое утверждение , что вам нужно будет создавать триллионы в день в течение следующих 100 лет, чтобы иметь шанс 50/50 на обман.Для этого Laravel опирается на ramsey / uuid для создания фактического поколения v4.ramsey/uuid использует , короче говоря, random_bytes для своей энтропии.Это криптографически надежный источник, достаточный для получения генерации v4 в соответствии с RFC.Теперь важная часть:

Если ни один из вышеупомянутых источников недоступен, тогда будет выдано исключение.

Так что ваш код, в котором вы делаете (string)Str::uuid(), будетгенерировать исключение, когда оно не может генерировать действительно случайное, глобально уникальное значение.

0 голосов
/ 11 октября 2018

UUID - это сокращение от «универсальный уникальный идентификатор», который представляет собой набор из 36 символов, содержащий буквы и цифры.Каждый набор должен быть уникальным, так как каждые 100 лет есть шанс повторения, вы можете прочитать об этом больше и посмотреть интересные статистические данные здесь и здесь .

Источник: Что такое UUID

...