In computer science, particularly in functional programming, hash consing is a technique used to share values that are structurally equal.[1] When a value is constructed, such as a cons cell, the technique checks if such a value has been constructed before, and if so reuses the previous value, avoiding a new memory allocation. A useful property of hash consing is that two structures can be tested for equality in constant time via pointer equality, which in turn can improve efficiency of divide and conquer algorithms when data sets contain overlapping blocks.[2] Hash consing has been shown to give dramatic performance improvements—both space and time—for symbolic and dynamic programming algorithms.[citation needed]

Hash consing is most commonly implemented with hash tables storing weak references that may be garbage-collected when the data stored therein contains no references from outside the table.[3][4]

Example

edit

The following is a simple (though inefficient) demonstration of a memoizer by means of hash table and weak references in Scheme. The bwp-object function returns true if the reference given is a broken weak pointer, i.e., the target has been garbage-collected.

;; weak hashes
;;
(require 'hash-table)

(define (make-weak-table . args)
  (apply make-hash-table args))

(define (weak-table-set! table key data)
  (let ((w (hash-table-ref table key #f)))
    (if w
        (vector-set! w 0 data)
      (let ((w (make-weak-vector 1)))
        (vector-set! w 0 data)
        (hash-table-set! table key w)))))

(define (weak-table-ref table key)
  (let ((w (hash-table-ref table key #f)))
    (if w
        (vector-ref w 0)
      #f)))

;; memoizer factory: for given (side-effect-free) procedure,
;; return a procedure which does the same memoizing some of results
;; in the sense of equal? on the whole list of args
;;
(define (make-weak-memoizer proc)
  (let ((cache (make-weak-table equal?)))
    (lambda args
      (let ((x (weak-table-ref cache args)))
        (if (bwp-object? x)
            (let ((r (apply proc args)))
              (weak-table-set! cache args r)
              r)
            x)))))

History

edit

A hash consing compilation technique was presented by A.P. Ershov in 1958.[5][6] The term "hash consing" originates from implementations in the context of Lisp in the 1970s.[7][8]

See also

edit

References

edit
  1. ^ Goto, Eiichi (1974-05-01), Monocopy and Associative Algorithms in an Extended Lisp, retrieved 2025-08-09
  2. ^ Liljenzin, Olle (2013). "Confluently Persistent Sets and Maps". arXiv:1301.3388 [cs.DS].
  3. ^ Allen, John (1978). Anatomy of Lisp. McGraw Hill. ISBN 0-07-001115-X.
  4. ^ Filliâtre, Jean-Christophe; Conchon, Sylvain (2006). "Type-Safe Modular Hash-Consing". Workshop on ML. ACM.
  5. ^ Ershov, A. P. (1 August 1958). "On programming of arithmetic operations". Communications of the ACM. 1 (8): 3–6. doi:10.1145/368892.368907. ISSN 0001-0782. S2CID 15986378.
  6. ^ "Sharing and Common Subexpression Elimination in EDSL compilation". okmij.org. Retrieved 27 April 2023.
  7. ^ Deutsch, Laurence Peter (1973). An Interactive Program Verifier (PDF) (Phd). Palo Alto: Xerox Palo Alto Research Center Technical Report CSL-73-1.
  8. ^ Goto, Eiichi (1974). Monocopy and associative algorithms in extended Lisp (PDF) (Technical report). Tokyo: University of Tokyo Technical Report TR 74-03.

Further reading

edit


📚 Artikel Terkait di Wikipedia

Hashlife

technique of hash consing may avoid creating a duplicate node representing those contents. If this is applied consistently then it is sufficient to hash the four

Flyweight pattern

patterns. In other contexts, the idea of sharing data structures is called hash consing. The term was first coined, and the idea extensively explored, by Paul

Sharing

memory between different data items to save space, otherwise known as hash consing. Resource sharing—called kaláka in Hungarian—is an old tradition in Hungary

Eiichi Goto

had introduced the innovative technique of hash consing to eliminate redundant memory usage by using a hash table to map duplicated values to the same

Cons

language) CAR and CDR Constructor (computer science) Algebraic data type Hash consing "Efficient Interpretation by Transforming Data Types and Patterns to

Purely functional data structure

Random access list, implemented as a skew-binary random access list Hash consing Zipper (data structure) In his book Purely Functional Data Structures

Interning (computer science)

existing values of objects which are to be interned. Flyweight pattern Hash consing "Design Patterns" (PDF). University of Washington. Jaworski, Michał (2019)