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