<< 猫ページ | Home | DB Magazineに、JavaEEの特集記事を書かせていただきました。 >>
PR: 転職    お墓    エコ    通販    結婚相談所    シルバー    質屋    葬式    漫画    エステサロン   

System.identityHashCode()って、一意である保証は無いのね。

Object.hashCode()のAPIドキュメントを見ていたら、

As much as is reasonably practical, the hashCode method defined by class Object does return distinct integers for distinct objects. (This is typically implemented by converting the internal address of the object into an integer, but this implementation technique is not required by the JavaTM programming language.)

ん〜、結構これ使って、キャッシュとか実装した記憶が(汗)。まぁ、32bit JVMならまず大丈夫そうだけど。

となると、オブジェクトの参照を見分けるには、まず、System.identityHashCode()で分けておいて、この値が同じものを、Listにでも保存して、==で線形に比較するしかないんだろうか。



Re: System.identityHashCode()って、一意である保証は無いのね。

C#などのCLR環境にも同じようなメソッドがあって(Object.GetHashCode())、同じような問題があります。 原理的に、heapあるいはstackのオブジェクトのアドレスなので、いま生きているというか参照が切れていない同一プロセス空間上のオブジェクトの範囲では実用的に一意…という解釈でいい…とは思うのですが…。 参照が切れた過去のオブジェクトまでの一意とか、別プロセス空間まで含めての一意、別ノードまで含めての一意となると、別の管理が必要ですよね。 私はいちいちGUID作ってた(場合によっては複数のGUIDを使った) 記憶があります。 ただ、それだと一意を保証するためのコストが高いので、特定のオブジェクトにしか使えません。 そこまで厳密な一意が要るオブジェクトは、私の経験の範囲ではそう多くありませんでした。

Re: System.identityHashCode()って、一意である保証は無いのね。

オブジェクトにGUIDを持たせるってことは、自分でいじれるオブジェクトですね。これなら、直列化を無視してよければ、単にlongのカウンタとかメモリ上に持って番号を振れば良さそうですね。

でもDIとかで、無限再帰しないようにインジェクト中のオブジェクトを覚えておくとか、汎用キャッシュとかだと、相手のソースをいじれるわけじゃないので、オープンクラスじゃない言語だと、難しそうです。そういえば直列化の際も、リング構造で、どうどうめぐりしないように、オブジェクトを覚えていたような気が。あれはどうなっているんだろう。


コメント追加 トラックバック送信
このサイトの掲載内容は私自身の見解であり、必ずしもIBMの立場、戦略、意見を代表するものではありません。
日本アイ・ビー・エム 花井 志生 Since 1997.6.8