3

関数( http://www.ietf.org/rfc/rfc4122.txt)を参照してv5UUIDを生成しようとしています。

/* uuid_create_sha1_from_name -- create a version 5 (SHA-1) UUID
   using a "name" from a "name space" */
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_t nsidヘルプを読みましたが、上記の関数の2番目( )と3番目(void *name)のパラメーターの違いはまだわかりません。

誰かが例を挙げて上記を説明してもらえますか?

また、RFC4122リンクで以下が何を意味するのかを理解したいと思います。これは、2番目のパラメーターにとって重要ですか?

/* Name string is a URL */
uuid_t NameSpace_URL = { /* 6ba7b811-9dad-11d1-80b4-00c04fd430c8 */
    0x6ba7b811,
    0x9dad,
    0x11d1,
    0x80, 0xb4, 0x00, 0xc0, 0x4f, 0xd4, 0x30, 0xc8
};
4

2 に答える 2

4

これnameは、uuidを生成しているものに固有のキーです。

namespace、UUIDを生成しているコンテキストを識別する定数UUIDです。

RFCを見ると、セクション4.3で名前ベースのUUIDの次の特性が定義されていることがわかります。

  • 同じ名前空間内の同じ名前から異なる時間に生成されたUUIDは等しくなければなりません。
  • 同じ名前空間内の2つの異なる名前から生成されたUUIDは、異なる必要があります(非常に高い確率で)。
  • 2つの異なる名前空間で同じ名前から生成されたUUIDは、(非常に高い確率で)異なる必要があります。
  • 名前から生成された2つのUUIDが等しい場合、それらは同じ名前空間の同じ名前から生成されました(非常に高い確率で)。

これらはすべて、名前ベースのUUIDに含まれる重要なプロパティです。たとえば、あなたと私がそれぞれの会社に人事システムを実装しているとしましょう。システムは互いに完全に無関係ですが、UUIDは優れているため、どちらも名前ベースのUUIDを使用して従業員を識別しています。また、それはかなり明白なことなのでname、UUIDの生成元として従業員名を使用します。

名前空間がないと、「JohnSmith」という名前の人に対して同じUUIDを作成します...しかし、システムは無関係であり、異なるJohn Smithを処理しているため、これは悪い(tm)になります。「だから何」とあなたは言う!...しかし、来年に会社が合併し、HRデータベースを統合する必要がある場合はどうなりますか?さて、その時点で、同じIDを持つデータベースレコードをマージしていることに気付き、すぐに会社のすべてのJohn Smithの給与が郵送され、HRからピンクの伝票が渡されます。

この種の事態が発生しないようにするために、RFCは、私たちがそれぞれ独立してUUIDを選択してを使用することを指定していますnamespace。名前空間は通常、固定され、UUIDが生成されている特定のシステムに関連付けられるため、おそらく、これを定数としてどこかの構成ファイルにハードコーディングします。したがって、私の名前空間(たとえば87c9cdf7-101d-4c05-a89d-c7aaff3a3fcf)内では、生成するUUIDJohn Smithが常に同じであると信頼できます。ただし、別の名前空間を使用するため、作成するUUIDとは異なることも期待できます。したがって、システムがマージされた場合、問題は発生しません。

于 2013-01-30T21:31:44.653 に答える
1

RFCのセクション4.3から引用すると、次のステップがあります。

その名前空間の名前から生成されたすべてのUUIDの「名前空間ID」として使用するUUIDを割り当てます。いくつかの事前定義された値については、付録Cを参照してください。

私が理解している限り、この名前空間の目的は、同じ名前を同じ意味で使用すると同じUUIDになるのに対し、同じ名前を異なる意味で使用すると異なるUUIDになるようにすることです。名前空間UUIDは実際の名前と連結され、両方が一緒にハッシュされます。

6ba7b811-9dad-11d1-80b4-00c04fd430c8 UUIDに関するコードスニペットは、そのセクションCに由来します。したがって、それを名前空間として使用する場合は、名前としてURLを使用する必要があります。たとえば、関数を次のように呼び出します。

uuid_t result_uuid;
const char* url = "http://www.example.com/document.txt";
uuid_create_sha1_from_name(&result_uuid, NameSpace_URL, url, strlen(url));

これとは対照的に、example.comドメイン全体のUUIDは、

uuid_t result_uuid;
const char* domain = "example.com";
uuid_create_sha1_from_name(&result_uuid, NameSpace_DNS, domain, strlen(domain));
于 2013-01-30T21:09:22.027 に答える