Тестовые векторы для UUID версии 5 (преобразование хэша в guid) алгоритм генерации? - PullRequest
4 голосов
/ 01 апреля 2011

Я пытаюсь найти несколько тестовых векторов, чтобы проверить мою реализацию RFC 4122 UUID версии 5 .

4.3 Алгоритм создания на основе имениUUID

Версия 3 UUID предназначена для помещения хеша MD5 в GUID.

Версия 5 UUID предназначена для помещения хэша SHA1 в GUID.

RFC имеет пример реализации на C:

void uuid_create_sha1_from_name(
   uuid_t *uuid,         /* resulting UUID */
   uuid_t nsid,          /* UUID of the namespace */
   void *name,           /* the name from which to generate a UUID */
   int namelen           /* the length of the name */
);

Я написал свою собственную реализацию на языке, который я использую.Учитывая количество головных болей, вызванных порядком байтов по сравнению с сетевым порядком, я уверен , моя реализация неверна.

Мне нужны некоторые примеры данных, например:

uuid = NameToGUID(
      {6ba7b811-9dad-11d1-80b4-00c04fd430c8}, //Namespace_URL
      "https://stackoverflow.com/questions/5515880"); //a url
CheckEquals(
      {8ABAD867-F515-3CF6-BB62-5F0C88B3BB11}, //expected uuid
      uuid);

См. Также

1 Ответ

2 голосов
/ 04 апреля 2011

Немецкая запись в Википедии для UUID получила пример для www.example.org:

6ba7b810-9dad-11d1-80b4-00c04fd430c8 // namespace UUID
www.example.org                      // url
74738ff5-5367-5958-9aee-98fffdcd1876 // expected UUID

Помимо этого, Java предлагает UUID класс Вы можете использовать для генерации тестовых данных .(РЕДАКТИРОВАТЬ: Это, кажется, только в состоянии генерировать UUID версии 1,2,3 и 4.)

В ответе на вопрос, который вы связали, есть ответ , где упоминаются некоторые библиотеки, которые могут генерировать версию3/5 UUID:

Кажется, есть несколько библиотек для генерации UUID версии 3/5, включая python uuid модуль, boost.uuid (C ++) и OSSP UUID.(Я не искал никаких .net)


OP Edit

В примере в Википедии DE есть небольшая ошибка:

  • он утверждает, что использует DNS имя www.example.org
  • данная последовательность байтов ASCII предназначена для www.example.com
  • , но хеш SHA1 использует www.example.org.

Я бы отредактировал страницу, чтобы изменить последовательность байтов с
0x63 0x6f 0x6d "com"
на
0x6f 0x72 0x67 "org"

но я не говорю по-немецки, не хочу создавать учетную запись, и я просто слишком ленивый

Пример сводится к

Namespace_DNS: {6ba7b810-9dad-11d1-80b4-00c04fd430c8}
Name:          "www.example.org"

объединитьпоследовательности байтов:

Bytes:         6b a7 b8 10 9d ad 11 d1 80 b4 00 c0 4f d4 30 c8   {6ba7b810-9dad-11d1-80b4-00c04fd430c8}
               77 77 77 2e 65 78 61 6d 70 6c 65 2e 6f 72 67      "www.example.org"

Хешируйте последовательность байтов с помощью SHA1 и скопируйте большую ее часть непосредственно в UUID:

SHA1 Digest:   74738ff5 5367 e958 9aee98fffdcd187694028007
UUID (v5):     74738ff5-5367-5958-9aee-98fffdcd1876
                             ^    ^

И обратите внимание на преобразование одного из кусочков в5 (для обозначения версии 5).
И старшие 2 бита другого байта устанавливаются в двоичный 10xxxxxx.

...