前田です。

At Wed, 27 Dec 2000 16:08:29 +0900,
Shugo Maeda <shugo / ruby-lang.org> wrote:
> > (*) 他にうまい言葉が思いつかないのですが…
> >     Object#hashCode() は、デフォルトの実装だと
> >     インスタンスが違えば極力違う値が得られるようになってます。
> >     それに対して、これら identity がないクラスのインスタンスでは、
> >     hashCode() の値は、文字列 (String)、整数値 (Integer) といった値から
> >     決められてしまいます。インスタンスごとの identity がないんです。
> >     これを表すうまい用語はないものでしょうか?
> 
> String#hashCode()がoverrideされてるのは、Stringのインスタンスに
> identityがないからではなくて、たんにより性質のよいハッシュ値を得
> るためだけではないでしょうか。

ちょっと訂正。

hashCode()がoverrideされてるのはequals()(同値チェックのメソッド)
がoverrideされているからですよね。
たぶん、より本質的なのはequals()のoverrideの方ではないでしょうか。

で、何でequals()がoverrideされているとコピーしても問題が少ないか
というと、たいていの場合オブジェクトが同一であることよりも同値で
あることの方がプログラミングにおいて重要な意味を持つからです。
# java-houseなどで何度も
# 「str1 == str2の結果がおかしいんだけど?」
# 「equals()を使え」
# というやり取りがあるのもその証左ではないかと。
# Rubyではそれを見越して(?)==を同値チェックに使ってますね。

しかし、Object#equals()は同一性のチェックになっているので、同値で
あるためには同一性を保存しないといけないからコピーできない。

つまり、首藤さんのおっしゃっている条件は、本当はidentityがあるか
どうかとかhashCode()とは直接関係なくて、immutableかつコピーしても
同値性が保存できるオブジェクト、という条件なのではないでしょうか?

-- 
前田 修吾