『IPアドレスは暗記してはいけない』その理由

英語は暗記するな! 1日30分・中学英語ではじめる学習法
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(:+)