哈希表的等式谓词

时间:2014-06-10 14:55:59

标签: comparison lisp hashtable common-lisp predicate

作为this调查的结果,我们知道使用特殊功能(针对某些类型的数据进行了优化)是一个好主意。我想创建一个哈希表,但this source说:

  

语法:

     

make-hash-table& key test size rehash-size rehash-threshold =>哈希表

     

参数和值:

     

test - 其中一个函数 eq eql equal equalp 的指示符。默认值为 eql

好吧,好吧。如果我想在使用字符串并使用string-equal时加快我的程序,该怎么办?对于其他高阶函数的等式谓词没有限制,但对于它们是make-hash-table。这是什么原因?

奖金" lisp历史"问题:为什么函数gethash被命名为?为什么不get-hash

1 个答案:

答案 0 :(得分:5)

什么是哈希表

哈希表通过计算对象的哈希并将对象存储在由哈希索引的井表中来工作。 测试函数必须满足所有对象xy

的基本条件
(FUNCALL test-function x y) ⇒
(= (FUNCALL hash-function x) (FUNCALL hash-function y))

ANSI CL标准规定了4个标准测试函数,并且在实践中,实现具有相应的散列函数。

定义您自己的测试/哈希

某些CL实现允许您定义自己的测试函数/散列函数对,例如

您的具体问题

当表格是字符串键时,我发现使用符号非常有利可图。

我会在那里创建一个特殊的packageintern字符串。

然后我会assign相应符号的值:而不是

(defparameter *mytable* (make-hash-table :test 'equal))
(setf (gethash "foo" *mytable*) <whatever>)

我愿意

(make-package "MY-PACKAGE")
(setf (symbol-value (intern "foo" "MY-PACKAGE")) <whatever>)

当字符串为read时,这是特别方便的,因为CL阅读器会为您实习。

当然有一些警告(例如,包必须明确deleted,否则它们不是GCed),所以这可能不是胆小的人。