📅  最后修改于: 2023-12-03 14:44:00.844000             🧑  作者: Mango
LISP 哈希表是一种用于存储键值对的数据结构,它可以快速地查找和访问对应的数据项。
哈希表是一种根据键(Key)而直接访问在内存存储位置的数据结构。也就是说,它通过把键值通过哈希函数映射到数组索引上,从而实现快速访问这些数据项。
哈希函数是哈希表中最重要的部分,因为它决定了键和值之间的映射关系。一般来说,哈希函数会在输入的键之上执行某种算法以生成一个散列值,然后将散列值映射到相应的数组索引上。
在 LISP 中,可以使用 sxhash
函数来生成哈希值。它能够返回一个整型数值来表示输入的对象的哈希码。
(sxhash 'hello-world) ; => 206655749
(sxhash 42) ; => 42
除了 sxhash
函数,你也可以自定义自己的哈希函数来根据特定的需求计算哈希值。
在 LISP 中,哈希表可以通过 make-hash-table
函数来创建。这个函数可以接受多个关键字参数,例如 test
、size
、rehash-size
等等,用于指定哈希表的行为和特性。
(make-hash-table) ; 创建一个默认的哈希表
在一个 LISP 哈希表上,你可以使用许多函数来进行增删改查操作。下面是一些常用的函数:
(setf (gethash key table) value)
将指定的键值对增加到哈希表中,如果键已经存在,将只更新对应的值。
(setf ht (make-hash-table))
(setf (gethash 'name ht) "Alice")
(setf (gethash 'age ht) 30)
(setf (gethash 'name ht) "Bob") ; 更新 'name' 的值
(setf (gethash key table default-value) value)
将指定的键值对增加到哈希表中,如果键已经存在,将只更新对应的值。如果键不存在,将创建一个新的键值对并且使用 default-value
作为默认值。
(setf ht (make-hash-table))
(setf (gethash 'name ht "unknown") "Alice")
(setf (gethash 'age ht 0) 30)
(setf (gethash 'gender ht "unknown") "Female") ; 增加新的键值对
(gethash key table &optional default-value)
获取指定键对应的值。如果键不存在,将返回 default-value
或者 nil
。
(setf ht (make-hash-table))
(setf (gethash 'name ht) "Alice")
(gethash 'name ht) ; => "Alice"
(gethash 'age ht) ; => nil
(gethash 'age ht 0) ; => 0
(maphash function table)
调用 function
函数并将哈希表中的每个键值对作为参数传递给它。
(setf ht (make-hash-table))
(setf (gethash 'name ht) "Alice")
(setf (gethash 'age ht) 30)
(maphash (lambda (key value) (print (list key value))) ht)
; 输出:
; (NAME "Alice")
; (AGE 30)
(remhash key table)
删除哈希表中指定的键值对。
(setf ht (make-hash-table))
(setf (gethash 'name ht) "Alice")
(remhash 'name ht)
(gethash 'name ht) ; => nil
LISP 哈希表是一种非常常用的数据结构,它可以帮助你存储和访问大量的数据项。了解 LISP 哈希表的实现方式和操作函数可以使你更加高效地使用它。