

    Article IDentification System(AIDS) Design Document


Revision History

  * 0.01  2007/12/14  mhsin  (未完成)


Problem

  BBS 使用者常常有一個需要：「告訴他人某篇特定文章，請那個人去閱讀」，可稱
  之為「文章識別系統(Article IDentification System, AIDS)」。
  最常見的 AIDS 為結合板名與文章編號：「xxxx 板的第 yyyy 篇文章（如果明顯
  可辨別為某個板，則直接指定文章編號）」，但是只要該篇文章之前的任何一篇文
  章被刪除並清理索引空位，之後的文章皆會向前遞補，因而造成原本指定的文章編
  號指向另一篇文章（或是沒有該編號）。
  因此較保險的做法是增加資訊，例如文章編號加上作者、標題，但這會造成描述一
  篇文章需要佔用大量的空間，顯得極不實用。

  理想的 AIDS 至少要能達成以下幾點：

    * 判別文章消失、指示錯誤
        使用不隨時間改變(time-invariant)並且達到一定程度唯一性(uniqueness)
        的文章識別子(Article IDentifier, AID)。
        通常只要做到「看板內唯一」即可，原因是使用習慣上常常會給定看板。

    * 識別子夠短、適合在各種環境使用
        識別子必須夠短，並且便於使用者在 BBS 內轉述、甚至轉述到其他如網頁
        或 IRC 等媒體。
        依目前的使用習慣，10 個字元的長度應該是上限。
        而使用的符號也應盡量使用單純的英數字，加上部分在各種環境較不需要
        escape 的符號。

    * 能有效率地從識別子找到原文章
        避免使用額外的空間。


Proposed Scheme

  Environment

    目前 pttbbs 所使用的文章及文摘檔名為：M（文章）或 G（文摘）、接著十進
    位的 31-bit 數字（事實上是一個 32-bit time_t 的正數部分）、接著 ".A"、
    再接著 "." 及一個三位的大寫十六進位數字（舊版程式產生出來的不包含最後
    著四個字元），以 regular expression 拮取：

    /^(M|G)\.(\d+)\.A(?:\.([0-9A-F]{3}))?$/
    $type = $1
    $v1 = $2
    $v2 = (defined($3) ? hex($3) : 0)

  AID(Article IDentifier)

    為一個最大 64-bit 的無號整數，現階段（可稱為 AIDv1）只使用 48-bit。
    AIDv1 中各欄位的意義：
      * info: 4-bit
          額外資訊。
            0: 一般文章("M")
            1: 文摘("G")
      * v1: 32-bit
          即 time_t 部分。
      * v2: 12-bit
          最後的三位十六進位數字。若不存在（舊檔名）則為 0。

    AID 另外有幾種表現形態：
      * AIDu(AID uncompressed)
          即 AID，以 uncompressed 強調其為原始形態。
      * AIDc(AID compressed)
          以類似 Base64 的表現方式（即每 6-bit 以一個字元表示），用字串表
          示 AIDu。
          目前以 0-9, A-Z, a-z, -, _ 共 64 個符號代表 6-bit 中 0~64 的值。
          AIDv1 使用 48-bit，故轉成 AIDc 時為 8 個字元長。
    AIDu 與 AIDc 可完全互相轉換。

  Resolve AIDu to filename

    從 AIDu 得到檔名只需將 $type, $v1, $v2 分別轉換回 "M" 或 "G"、十進位數
    字、三位十六進位數字，再組合成檔名即可。
    但由於 AIDv1 不記錄檔名是否為舊版程式所產生（$3 部分不存在，$v2 被設為
    0），故解析出如 M.123456789.A.000 這樣的檔名，若檔案不存在，則會去掉最
    後四個字元，以 M.123456789.A 再嘗試一次。（理論上這兩個檔案幾乎不可能
    同時存在）





