ID (2)

ID は 29 bit と紹介したが、では

  • (1) 32 bit 限定なの?
  • (2) 3 bit はどこいった?

という疑問が生じる。回答を述べると、(1) は、Yesで、(2) は ID の種類に使っている。

32ビットの理由。一般的な辞書的テーブルには key と value にそれぞれ VALUE が入る幅になっているので、それぞれ 64bitだ(64 bit CPUなら)。MRI には、ID を key にするデータ構造が沢山あるので、rb_id_table という特別なハッシュテーブルがある。このとき、key を 32 bit に限定してしまうと、速度的に嬉しい。で、229 個くらいしかできないだろう、と考えて、このようにしている。

ちょっと計算してみると、600M 個の ID で、それぞれ 8B の名前が必要とすると、600M x (4B (sizeof(ID) + 8B (sizeof(name)) = 7GB。単に ID の管理だけで 7GB も食うような Ruby プログラムは、とりあえず現在は考えづらいので、このような制限にしている。

rb_id_table については、また後日。