不定期ウィークリィFYI:連番IDをやめてGUIDにするメリット

いつのはなしですか?

 

 

Enumとか使うやつは死んでしまえ。

 

いまどきほにゃららIDとかいって連番の数字を使うのはやめたほうがいいと思う。

 

ユニークなIDがほしいならGUIDを使えばよいだけのことです。それはもう20年位前から当たり前に使われています。(例:COMのクラスIDとかインタフェースID)

 

GUIDの代わりに文字列のハッシュ値を用いても悪くないんじゃないですか。まともなスクリプト言語はみなそういう実装かと思いますよ。

 

 

 

IDはありとあらゆる場面で使われます。組み込み系だとID天国(地獄)ではないでしょうか。プロトコルID、データID、ステータスID、ユーザID、マシンID、・・・

 

 

 

もしIDをGUIDにしたら、こんなメリットがあります。

 

・採番する時に、衝突を気にしないでよい(適切なツールを用いれば)

 

 

 

間抜けな例で説明すると、

 

   

Enum 状態ID{

   

  初期状態=0,

   

  作動中=1,

   

  待機中=2,

   

  異常=99,

   

};

 

というようなIDにおいて、3~98を”空けておく”などという間抜けが発生しないということです。あるいは、このIDを用いるライブラリ作成協力会社が3社あったとして、従来なら、

 

   

あらかじめ追加が必要なIDをすり合わせしておいて、ヘッダを配布してから、実装開始

   

あるいは追加ID分をあとでマージする

 

というようなイカにも事故が起きそうな事態を避けられます。

 

まぁちょっと例がイマイチなので伝わっていない感じがマックスな気もしますが。

 

 

 

 

 

さて、この推奨ルールに対する反応はこんな感じです

 

・ただのint(4バイト)で済むものを16バイトも消費するなんてそっちこそ狂気の沙汰

 

・IDが衝突したらどうすんの?

 

 

 

ただのintとかいう阿呆には「せいぜい100パターンしかないIDを格納するのに4バイト使ってるのは狂気じゃないの?」という言葉を贈ります。

 

衝突については、コンパイル時に検出できるので心配するだけ無駄でしょう。

 

もちろんDLL的なものあるいはCOMそのものなら、衝突によって混乱が生じますがね。

 

 

 

重複のチェックすらしていない連番IDでは、しょっちゅう混乱が発生しているはずです。

 

スクリプトや初期化処理でチェックしている実装も多く見ましたが、多くは最初から不要なはずの処理なのです。

 

 

 

 

 

RDBのIDもタチが悪いですね。連番をAUTOで付加したりして。そもそもなんで連番が必要なんです?考えたことがありますか?

 

連番でレコードに番号を付けておいて、あとで削除したら抜けが存在するんですよ?それはなんの意味があるんです?人間に分かりやすいように?

 

ということはつまり、Excelの表につける意味のない「項番」列と同じ程度の意味しかないということでよろしいんですね?

 

じゃぁそれを識別子に用いるのは不適切ですよね?

 

その番号はあくまでも属性であって識別子であるべきではないと。

 

 

 

まぁ、そんなところです。