Function SXHASH

UP


Function SXHASH

Function SXHASH

構文

sxhash object => hash-code

引数と戻り値

object - オブジェクト
hash-code - 非負の整数

定義

sxhashは、objectのハッシュコードを返却します。

ハッシュコードを計算する方法は実装依存ですが、 次のような明確な制約に従う必要があります。

  1. (equal x y)(= (sxhash x) (sxhash y))を意味します。

  2. 2つのオブジェクトxyが、両方ともbit-vector, 文字列, コンス, 数, pathname, 文字列, シンボルのどれかであり、 それらが似ているとき、 さらにxyが同じ実装の違うLispイメージ上に存在するときであっても、 (sxhash x)(sxhash y)は数学的に同じ値になります。 3.2.4. ファイルコンパイル時のリテラルオブジェクトをご確認ください。

  3. オブジェクトのhash-codeは、 そのオブジェクトが等価のテストequalで確認できるような 目に見える変更でもされない限り、 ひとつのセッション内で常に同じ値になります。

  4. hash-codeはハッシュに使用されます。 これは仕様に適合した実装に検証可能な制約はしませんが、 実装は非負のfixnumの範囲内で うまく分散されたhash-codeを生成するために 誠実に努力すべきであるという意図があります。

  5. 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内の他の関数で使われているハッシュの手順とは 必ずしも関係する必要がありません。

equaleqとして比較する型のオブジェクトのとき、 3番目の項目はhash-codeがオブジェクトの 同一性の不変の性質に基づくことを要求しています。 もうひとつの正当な実装手法は、 類似しているもののeqではないオブジェクトが 同じハッシュコードを持たなければいけないという要求がないので、 sxhashはこれらのオブジェクトに対して ランダムなハッシュコードを割り当てる (そしてキャッシュする)ようにすることです。

シンボルの類似性は、シンボル名とそのシンボルがアクセス可能な パッケージの両方で定義されますが、 あるシンボルのパッケージの状態は変更されてもイコールで見えないため、 項目3ではパッケージ情報を使ってハッシュコードを計算することを禁止しています。


TOP, Github