首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在SBCL中为自定义哈希表定义哈希函数

在SBCL中为自定义哈希表定义哈希函数
EN

Stack Overflow用户
提问于 2021-11-12 15:05:13
回答 1查看 58关注 0票数 1

SBCL手册说,可以使用以下宏来定义自定义哈希表的测试:

代码语言:javascript
复制
(sb-ext:define-hash-table-test ht-equality-fn ht-hash-fn)

其中ht-equality-fn确定两个键是否相同,ht-hash-fn确定键的哈希值。

在这个特定的例子中,键本身就是结构(用defstruct定义),其中的一个槽包含一个哈希表,表中有固定的键和T值(表示固定数的集合)。

如果我正确理解了SBCL要求,那么编写ht-equality-fn的简单方法似乎是:

代码语言:javascript
复制
(defun ht-equality-fn (key1 key2)
  (equalp (ht-accessor key1) (ht-accessor key2))

但我不知道如何编写散列函数来获得非负的fixnum散列代码:

代码语言:javascript
复制
(defun ht-hash-fn (ht)
  ???)

一开始我想使用sxhash,但hyperspec说这只适用于equal键(而不是equalp,因为哈希表相等性测试需要)。谢谢你的帮助。

EN

回答 1

Stack Overflow用户

发布于 2021-11-14 17:26:20

一个快捷的散列函数代码是简单地对输入ht中的fixnum键求和,因为对于任何fixnums的排列,总和都是相同的。对于这个问题,正如事实证明的那样,ht的固定数都明显小于most-positive-fixnum,因此和不应该超过最大值。然而,考虑到许多不同的fixnum集合可以加起来为相同的值,最坏情况下的散列性能可能是不足的。

代码语言:javascript
复制
(defun ht-hash-fn (ht)
  (declare (hash-table ht))
  (let ((sum 0))
    (declare (fixnum sum))
    (maphash (lambda (key value)
               (declare (fixnum key) (ignore value))
               (incf sum key))
      ht)
    sum))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69944964

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档