Common Lisp में हैश टेबल एक डेटा स्ट्रक्चर है जिसमें डेटा को की और वैल्यू के जोड़ों के रूप में रखा जाता है। यह हर की को एक वैल्यू से जोड़ती है। की और वैल्यू, दोनों ही कोई भी ऑब्जेक्ट हो सकते हैं।
हैश टेबल make-hash-table फंक्शन से बनाई जा सकती हैं।
make-hash-table फंक्शन हैश टेबल की शुरुआती साइज़ और उसके बढ़ने की सीमा को ठीक करने के लिए कई कीवर्ड पैरामीटर लेता है। इनके बारे में पूरी जानकारी के लिए डॉक्युमेंटेशन देखिए।
इससे भी ज़रूरी बात यह है कि यह एक test कीवर्ड पैरामीटर भी लेता है, जो तय करता है कि की और वैल्यू जोड़ते, ढूँढते और हटाते समय की की तुलना कैसे होती है।
test आर्गुमेंट की वैल्यू 'eq, 'eql, 'equal या 'equalp में से कोई एक हो सकती है, जो जेनेरिक समानता प्रेडिकेट के बराबर हैं।
डिफॉल्ट वैल्यू 'eql है।
किसी की से उसकी वैल्यू निकालने के लिए gethash का उपयोग किया जाता है।
gethash एक [ऑप्शनल आर्गुमेंट][concept-defualt-arguments] लेता है, जो तब लौटाई जाने वाली वैल्यू होती है जब वह की हैश टेबल में मौजूद न हो।
gethash एक से अधिक वैल्यू भी लौटाता है (इसका वर्णन किसी दूसरे कॉन्सेप्ट में किया गया है)।
पहली वैल्यू हैश टेबल में उस की से जुड़ी वैल्यू होती है; अगर वह की मौजूद न हो तो दी गई डिफॉल्ट वैल्यू, और वह भी न दी गई हो तो NIL।
दूसरी वैल्यू एक बूलियन होती है, जो बताती है कि वह की हैश टेबल में मौजूद थी या नहीं।
की और वैल्यू का जोड़ा जोड़ने के लिए gethash के साथ setf का उपयोग किया जाता है।
किसी की और उसकी वैल्यू को हटाने के लिए remhash का उपयोग कीजिए।
सारी की और वैल्यू हटाने के लिए clrhash का उपयोग कीजिए।
दूसरी भाषाओं की तरह Common Lisp की हैश टेबल में भी क्रम की कोई गारंटी नहीं होती, लेकिन कभी-कभी उस पर एक-एक करके चलकर हर की और वैल्यू के जोड़े पर काम करना काम का होता है।
यह काम maphash से किया जा सकता है:
(maphash #'(lambda (key value) (print (cons key value))) *hash-table*)
(यह हर की और वैल्यू को एक कॉन्स पेयर के रूप में, हर बार एक पंक्ति में प्रिंट करेगा।)
(setf *hash-table* (make-hash-table)) ; => #<HASH-TABLE :TEST EQL :COUNT 0 {100375FD23}>
(gethash :foo *hash-table*) ; => NIL
; NIL
(gethash :foo *hash-table*
:default-value) ; => :DEFAULT-VALUE
; NIL
(setf (gethash :foo *hash-table*) :bar) ; => :BAR
(gethash :foo *hash-table*) ; => :BAR
; T
(setf (gethash :key *hash-table*) :value) ; => :RIGHT
(gethash :key *hash-table*) ; => :VALUE
; T
(remhash :key *hash-table*) ; => T
(gethash :key *hash-table*) ; => NIL
; => NIL
(clrhash *hash-table*) ; => #<HASH-TABLE :TEST EQL :COUNT 0 {1005A90103}>
(gethash :foo *hash-table*) ; => NIL
; NIL