シリアル番号

シリアル番号（シリアルばんごう、）は、ある決まった個々の識別をするために割り当てられる、一連の一意で等差な整数である。連続番号（れんぞくばんごう）、略して連番（れんばん）という場合もある。

数値的識別子が全てシリアル番号というわけではなく、シリアルではない識別番号の例として、数値に識別以外の情報がない（名目値とは無関係）がある。

シリアル番号は任意の数から始めることができ、さらに任意の一定差分ずつ増減させることができる（ただし途中で差分を変えることはできない）。しかし通常は、1 または 0 から1ずつ増え総数または総数－1で終わり、総数を超えたり負数になることはない。

使用例 
典型的用法が拡大され、オブジェクトの大きな集合の元を識別する数値や文字列だけでなく、情報工学におけるデータ処理での識別に使われるようになった。

シリアル番号の例 
 シリアル番号は品質管理で有効であり、ある期間に製造した製品に欠陥が見つかった際に、シリアル番号によって素早く欠陥商品群を特定することができる。また、盗難や偽造に対してもシリアル番号が有効であり、盗品や偽造品の発見を容易にする（製造番号参照）。
 日本のように、紙幣にユニークなシリアル番号が付与されている国もあり、シリアル番号は偽札の追跡にも活用される。
 都道府県コードは、47都道府県におよそ北東から南西へ、01から47までのシリアルなコードが割り振られている。
 小惑星番号は、最初の小惑星ケレスの1番から始まる、確定順の番号である。

シリアルでない番号
 コンピュータのソフトウェア製品には固有のライセンスキー番号が付与され、インストール時にその番号の入力を要求されることが多い。これは俗に「シリアル」と呼ばれるが、偽造された番号での利用を防ぐために冗長性を持たせているので、シリアルではない。もしシリアルなら、でたらめに打ち込んだ番号も（ライセンス総数を超えない限り）いずれかのライセンスに対し発行された有効な番号になってしまう。
 雑誌などの定期刊行物にはISSNが付与されるが、ISSNの第5桁から第7桁は国内雑誌に対しシリアルであるものの、ISSN全体としてはシリアルではない。書籍にはISBNが付与され、出版社によっては「書名記号」はその出版社の書籍に対しシリアルだが、そうでない出版社も多く、またISBN全体もシリアルではない。
 暗号理論の広範囲な利用に認証局が必要とされる。認証局が発行する公開鍵は、後述するシーケンス番号の算術が適用されるが、シリアル番号ではない。

シリアル番号から総数を推定する 
何らかの製品に1から始まるシリアル番号が付与されている場合（始まりが1でないが既知の場合は定数を加減することで1から始まるシリアル番号に変換できる）、n 個のサンプルをとることで総数の推定ができる。

最も単純には、シリアル番号の最大値が N ならば、総数は N 個以上である。より精細には、ベイズ推定や最尤法をつかった大雑把な総数の推定が可能である。

シーケンス番号の算術 
シリアル番号は通信プロトコルでよく使われ、シーケンス番号などと呼ばれる。これは、パケットの順序を確定するために必須である。しかし、シーケンス番号に割り当てられるビット数は固定であり、一巡すると再度最初から番号が再利用される。従って、最近割り当てられたシリアル番号とずっと以前に割り当てられたシリアル番号が同じということになる。このようなシーケンス番号の曖昧さによる問題を防ぐため、RFC 1982（Serial Number Arithmetic）では、この種のシリアル番号を使った計算に関する特別なルールを定義している。

一部のプロトコルは問題を無視し、単にシリアル番号として大きな整数を使い、問題が発生する前に技術が廃れるだろうと見なしている（2000年問題参照）。

シーケンス番号の演算 
ここでは、シーケンス番号に小さな正の整数を加算することと、シーケンス番号同士の比較について解説する。符号なしの実装だけを扱い、ビット数は RFC と同様 "SERIAL_BITS" で表す。

加算 
シーケンス番号への整数の加算は、単純な符号なしの整数の加算の後で、符号なしの剰余演算を行って加算結果を範囲内に収める（一般にCPUの符号なしの加算命令では自動的にそのような演算が行われる）。

    s' = (s + n) modulo (2 ^ SERIAL_BITS)

以下の範囲外の値の加算は未定義である。

    [0 .. (2 ^(SERIAL_BITS - 1) - 1)]

基本的に、加算結果がこの範囲外であれば「丸め」が発生し、結果としてシーケンス番号は元の値より小さくなる。

比較 
2つのシーケンス番号 i1 と i2（シーケンス番号 s1 と s2 の符号なし整数表現）の比較方法を以下に示す。

等しいかどうかの比較は通常の数値の比較と変わらない。大小比較のアルゴリズムは複雑であり、一方のシーケンス番号が値の範囲の限界付近の場合を考慮して「丸められた」小さい値を実際には大きい値と判断しなければならない。つまり、s1 が s2 より小さいと見なされるのは、以下の場合である。

    (i1 < i2 and i2 - i1 < 2^(SERIAL_BITS - 1)) or
    (i1 > i2 and i1 - i2 > 2^(SERIAL_BITS - 1))

同様に、以下の場合に s1 は s2 より大きいと見なされる。

    (i1 < i2 and i2 - i1 > 2^(SERIAL_BITS - 1)) or
    (i1 > i2 and i1 - i2 < 2^(SERIAL_BITS - 1))

欠点 
このアルゴリズムにはいくつか問題がある。まず、数値によっては大小比較結果が定義されないことになる。アルゴリズムの実装は各種組織が独立して行っているため、そのような問題の発生を防ぐことは不可能に近い。

 では以下のように書いている:

参考文献
 William W. Plummer, "Sequence Number Arithmetic" BB&N Inc, September 1978.
 R. Elz and R. Bush, , "Serial Number Arithmetic" Network Working Group, August 1996

脚注

関連項目
順序数
宝くじ - 番号が続き、等級賞と前後賞を同時に狙う複数枚のセットを「連番」という。

外部リンク

A C++ implementation

識別子
数列