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ではパッケージ情報を使ってハッシュコードを計算することを禁止しています。