『IPアドレスは暗記してはいけない』その理由
IPv4アドレスは2進数だと32bit固定長の数値です。可読性を上げるため、例えば「198.51.100.240」のように、8bitごとに4個の10進数を"."で区切って表記します。このため、IPアドレスの表記に必要な数字の数は、最短で4個、最長で12個です。では平均的には何個になるでしょう?計算してみます。
1オクテット(8bit)の数字を10進数に直したときの桁数は、
- 1桁 : 1,2,3,4,5,6,7,8,9,0 ・・・10パターン
- 2桁 : 10〜99 ・・・90パターン
- 3桁 : 100〜255 ・・・156パターン
となりますので、平均で2.5703125桁となります。4オクテット分なので、4倍すると10.28125。おおよそ数字10個分だと思ってよいでしょう。具体的には次の表のようになります。さらにIPアドレスには、Mrtianアドレスといって、送信元IPアドレスにはなりにくいアドレス帯があります。それを除外した場合についても併記します。
単純計算 | Martianアドレスを除外した場合 | |
---|---|---|
数字4個 | 10,000個 | 9,000個 |
数字5個 | 360,000個 | 332,000個 |
数字6個 | 5,484,000個 | 5,134,180個 |
数字7個 | 46,008,000個 | 43,250,220個 |
数字8個 | 231,843,600個 | 216,087,398個 |
数字9個 | 717,724,800個 | 654,117,020個 |
数字10個 | 1,334,586,240個 | 1,173,176,898個 |
数字11個 | 1,366,709,760個 | 1,143,922,884個 |
数字12個 | 592,240,896個 | 466,229,088個 |
合計 | 44,157,632,512個 | 37,860,674,744個 |
平均 | 数字10.28125個分 | 数字10.22637個分 |
人が短期記憶できる数字は、最大7±2個であると指摘されています。ずいぶん昔の文献です。早くからこの分野が研究されていたということだと思います。
Miller, G. A. (1956). The magical number seven, plus or minus two: Some limits on our capacity for processing information. Psychological Review, 63, 81-97
この研究を参考にして、技術的な分野では、安全マージンをとって5桁までの数字しか暗記しないルールにするとよいでしょう。IPv4アドレスは、平均で数字10個分となります。暗記をしてみたくなる長さと言えますが、人のワーキングメモリを充分に超える長さです。IPアドレスは暗記しようとせず、必ずメモをとるか、もしくは情報源からそのままコピー・アンド・ペーストしましょう。
なおIPv6アドレスは128bit固定長なので、16進数表記をしたとしても暗記はほぼ困難。あんまりこういうことを考えなくてもいいでしょう。
ちなみに平均値の算出に利用したスクリプトはこちら。
def keta(n) return 1 if n < 10 return 2 if n < 100 return 3 end def isMartian(i, j, k) return false if i == 0 # 0.0.0.0/8 return false if i == 10 # 10.0.0.0/8 return false if i == 100 and j >= 64 and j < 128 # 100.64.0.0/10 return false if i == 127 # 127.0.0.0/8 return false if i == 169 and j == 254 # 169.254.0.0/16 return false if i == 172 and j >= 16 and j < 32 # 172.16.0.0/12 return false if i == 192 and j == 0 and k == 0 # 192.0.0.0/24 return false if i == 192 and j == 0 and k == 2 # 192.0.2.0/24 return false if i == 192 and j == 168 # 192.168.0.0/16 return false if i == 198 and j >= 18 and j < 20 # 198.18.0.0/15 return false if i == 198 and j == 51 and k == 100 # 198.51.100.0/24 return false if i == 203 and j == 0 and k == 113 # 203.0.113.0/24 return false if i >= 224 # 224.0.0.0/4, 240.0.0.0/4 return true end num = Array.new(13, 0) (0..255).each do |i| (0..255).each do |j| (0..255).each do |k| if isMartian(i, j, k) l = keta(i) + keta(j) + keta(k) num[l+1] += 10 num[l+2] += 90 num[l+3] += 156 end end end puts i.to_s end p num a = 0 num.each_index {|i| a += i*num[i]} p a p a.to_f/num.inject(:+)