CLISP语言中的哈希表

发布: 2008-07-23 07:47


  1. 概要

    hash表是一种非常重要的数据结构,用于存储键/值对.
    可方便的向hash表中加入条目,使用键值取得条目.
    根据运行效率的不同, CLISP中有三种hash表类型: 标准hash表,快速hash表和稳定hash表.
    它们的区别是:


    对于快速hash表,垃圾回收器会便利其中的哈希值无效,被错误的回收了(除非所有的key值都是即对象,如常量字符串,数字等).
    对稳定hash表,垃圾绝不会对其进行错误回收,因此key值可以是任何CLISP对象.
    使用的时候注意,一般对生命周期短的hash表可以考虑使用快速hash表.




  2. hash表操作函数


    1. make-hash-table 创建一个hash表

      (MAKE-HASH-TABLE &KEY :TEST :INITIAL-CONTENTS :SIZE


      :REHASH-SIZE :REHASH-THRESHOLD
      :WARN-IF-NEEDS-REHASH-AFTER-GC :WEAK)





      :TEST 可选参数可以为EXT:FASTHASH-EQ, STABLEHASH-EQ,分别表示创建快速hash表和稳定hash表.
      :INITIAL-CONTENTS 初始化值
      :SIZE hash表大小




    2. gethash 取出一条

      (gethash key hash-table)



    3. remhash 删除一条,remove from hash的意思

      (remhash key hash-table)



    4. clrhash 清空hash表,执行这个函数后,hash表中的元素个数为0,但大小不一定为0.

      (clrhash hash-table)



    5. hash-table-count hash表中的元素个数


    6. hash-table-size hash表的大小


    7. hash-table-p 检测一个对象是否是hash表.

      (hash-table-p object)



      CL> (hash-table-p (make-hash-table))
      T



      CL> (hash-table-p 123456)
      NIL



      CL> (hash-table-p "abcd")
      NIL



    8. sxhash 返回一个对象的hash 值.

      CL> (sxhash 123456)
      3950784



    9. hash-table-test 检测hash表使用哪种key值比较方式.

      可能的比较方式有:



      EXT:FASTHASH-EQ EXT:FASTHASH-EQUAL



      EXT:STABLEHASH-EQ EXT:STABLEHASH-EQUAL



      EXT:FASTHASH-EQL EQUALP



      EXT:STABLEHASH-EQL




  3. 遍历hash表中的元素

    宏 DOHASH , 与DOLIST比较类似.



    (EXT:DOHASH (key-var value-var hash-table-form [resultform])



    key-var 遍历过程中存储key的变量.



    value-var 遍历过程中存储value的变量.



    hash-table-form 表示一个hash表对象



    resultform 这个语句的值作为DOHASH表达式的值返回.






原文: http://qtchina.tk/?q=node/212

Powered by zexport