原です。

|  9 * ( 1 + (i['From']<=>j['From']) ) +
|  3 * ( 1 + (i['Subject']<=>j['Subject']) ) +
|      ( 1 + (i.time<=>j.time) ) - ((27-1)/2)

これって 1 + が全部いらないってことでは?ついでに 3 base じゃ
なくて 2 で十分ですよね。:

  (i['From']<=>j['From']) << 2 +
    (i['Subject']<=>j['Subject']) << 1 + 
    (i.time<=>j.time)

もとの <=> が -1,0,1 しか返さないと決まっていれば。