[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Hash procedures

This page is part of the web mail archives of SRFI 69 from before July 7th, 2015. The new archives for SRFI 69 contain all messages, not just those from before July 7th, 2015.

SRFI-69 proposes the following hash procedures

    hash            consistent with equal?
    string-hash     consistent with string=?
    string-ci-hash  consistent with string-ci=?
    symbol-hash     consistent with eq? on symbols only

These names seem to have been chosen to highlight the
name of the type of object being hashed.  Better would be
a naming convention that makes explicit the link between the
hash procedure and the comparison procedure (after all there
are many application-specific ways to define the equality of
two values of a given type).  I would suggest the following
(taken from Gambit):

    equal?-hash      hash
    eqv?-hash        no equivalent
    eq?-hash         no equivalent, but subsumes symbol-hash
    string=?-hash    string-hash
    string-ci?-hash  string-ci-hash

This consistent naming scheme reduces the programmer's
"intellectual clutter".

I suggest dropping the symbol-hash procedure, for the more
general eq?-hash procedure.  Moreover, eqv?-hash can be used
when the keys are numeric (re: make-integer-hash-table).

I also suggest adding the constraint that hashing a string
x with string=?-hash and a symbol y with equal?-hash, eqv?-hash,
or eq?-hash, must yield the same hash number when
(string=? x (symbol->string y)).  This is useful
when dealing with textual data in a mixed string/symbol
representation, that is you need to use something like
the following key comparison procedure

   (define (text-equal? x y)
       (if (string? x) x (symbol->string x))
       (if (string? y) y (symbol->string y))))

then you can still use the default equal?-hash.