% Function SXHASH
Function SXHASH
sxhash
object => hash-code
object - オブジェクト
hash-code - 非負の整数
sxhash
は、objectのハッシュコードを返却します。
ハッシュコードを計算する方法は実装依存ですが、 次のような明確な制約に従う必要があります。
(equal x y)
は(= (sxhash x) (sxhash y))
を意味します。
2つのオブジェクトx
とy
が、両方ともbit-vector
, 文字列, コンス,
数, pathname
, 文字列, シンボルのどれかであり、
それらが似ているとき、
さらにx
とy
が同じ実装の違うLispイメージ上に存在するときであっても、
(sxhash x)
と(sxhash y)
は数学的に同じ値になります。
3.2.4. ファイルコンパイル時のリテラルオブジェクトをご確認ください。
オブジェクトのhash-codeは、
そのオブジェクトが等価のテストequal
で確認できるような
目に見える変更でもされない限り、
ひとつのセッション内で常に同じ値になります。
hash-codeはハッシュに使用されます。
これは仕様に適合した実装に検証可能な制約はしませんが、
実装は非負のfixnum
の範囲内で
うまく分散されたhash-codeを生成するために
誠実に努力すべきであるという意図があります。
hash-codeの計算は、objectが循環構造を含んでいるときでも 終了しなければなりません。
(= (sxhash (list 'list "ab")) (sxhash (list 'list "ab"))) => true
(= (sxhash "a") (sxhash (make-string 1 :initial-element #\a))) => true
(let ((r (make-random-state)))
(= (sxhash r) (sxhash (make-random-state r))))
=> implementation-dependent
なし。
実装。
なし。
なし。
多くのハッシュについての一般的なの要求は、
make-hash-table
とハッシュテーブルに関連する関数によって満たされます。
sxhash
は、あらかじめ定義された抽象化では
不十分な場合に使うことを意図しています。
sxhash
の主な目的は、
ハッシュテーブルで提供されるよりも複雑なハッシュの例を、
ユーザが簡単に実装できるようにすることです。
sxhash
が返すハッシュコードは、
Common Lisp内の他の関数で使われているハッシュの手順とは
必ずしも関係する必要がありません。
equal
がeq
として比較する型のオブジェクトのとき、
3番目の項目はhash-codeがオブジェクトの
同一性の不変の性質に基づくことを要求しています。
もうひとつの正当な実装手法は、
類似しているもののeq
ではないオブジェクトが
同じハッシュコードを持たなければいけないという要求がないので、
sxhash
はこれらのオブジェクトに対して
ランダムなハッシュコードを割り当てる
(そしてキャッシュする)ようにすることです。
シンボルの類似性は、シンボル名とそのシンボルがアクセス可能な パッケージの両方で定義されますが、 あるシンボルのパッケージの状態は変更されてもイコールで見えないため、 項目3ではパッケージ情報を使ってハッシュコードを計算することを禁止しています。