Kan-Ru Chen's Weblog

Understanding UUID

通用唯一識別碼 (Universally Unique IDentifier, UUID) 或是全域唯一識別 碼 (Globally Unique IDentifier, GUID) 是一個 128 bits 的整數,並保證其 在時間與空間的分佈都是獨一無二的。UUID 由開放軟體基金會(OSF) 標準化後 用在他們的 DCE 系統上,後來在微軟的 COM 系統上發揚光大。除此之外在許多 地方也都可以看到 UUID 的身影,如 Linux 上的分割表/區塊裝置就是以 UUID 來標示,或是RSS 的 <guid> 標籤也可以使用 UUID,實際上 UUID 是標準的 URN 表示法之一,你可以在任何需要標示單一物件的地方使用 UUID。

UUID 的文字形式為一個 8-4-4-4-12 的十六進位表示,共有 16 個 bytes,有 人說使用 UUID 不方便人類辨識,但了解 UUID 的組成後你還是可以從這個表示 法看出一些端倪來。本文參考的是 IETF 版本的 RFC4122。

UUID

UUID 共有四個版本,第 13 個字元的位置就是表示版本號。第一種是以時間和網 路卡號組成,時間是以一百奈秒為單位,網路卡號理論上是不會重複的,再加上 clock_seq 這個每次開機重設一次的亂數欄位,就算時間回朔了也不會重複, 代號是 1。第二種和第四種是以命名空間加上一個 hash 組成的,分別可以使 用MD5 或是 SHA1 演算法,算出來後就填到空位中,代號是 35。第三種 是全亂數組成,代號是 4

因此我們可以在不同的情境選用不同的 UUID,也可以從 UUID 看出版本跟時間等 資訊,如 4ef17586-f187-11df-8xxx-xxxxxxxxxxxx 看到第三個區塊是 11df 就可以知道是最近產生的以時間卡號為基礎的 UUID,時間 1dff1874ef17586 解出來就是 2010-11-16 13:42:09.173031.0 UTC。而 7c0fdbe4-1b09-4278-9fc9-5f0c6a1f2ae2 就是純亂數的 UUID,沒有任何 意義。

uuid-el

在轉換 Blog 到 ikiwiki 的時候,為了要整合 Disqus 系統,每篇都需要一個唯 一的識別碼,這樣 Disqus 就只認 UUID 而不是網址,將來網址變了也可以對得 上,而此 ID 也可以用在 RSS, ATOM 上面。研究了 RFC 4122 後,用 elisp 寫 了產生 UUID 的工具,uuid-el,使用只需要:

    (require 'uuid)
    ;; Generate UUIDv1
    (uuid-1)
    ;; Generate UUIDv4
    (uuid-4)
    ;; Generate UUIDv3, v5
    (uuid-3 uuid-ns-url "http://example.com")
    (uuid-4 uuid-ns-url "http://example.com")

搭配以下 snippet 就可以快速展開需要的 metadata:

    # -*- mode: snippet -*-
    # name: meta
    # key: meta
    # --
    \[[!meta title="$1"]]
    \[[!meta guid="${1:$(uuid-urn (uuid-5 uuid-ns-kanru text))}"]]
    \[[!meta date="${2:`(current-time-string)`}"]]
    $0

最後補上影片:

下一集:用 ffmpeg 製作桌面錄影