# Do hash-key and hash-values give their results in the same order?

When working with hash tables in Racket, two useful functions are `hash-keys`

and `hash-values`

. The first returns all the keys used in the hash table, as a list. The second returns, analogously, the values. Nothing terribly surprising there.

When we need to work, separately, with the keys and the values of a hash table, an interesting question presents itself:

*Is it safe to assume that the list that hash-keys returns has the same order as the list returned by hash-values?*

Is, for instance, the first element of the list returned by `hash-values`

the hash value of the first element returned by `hash-keys`

? To put the question in terms of code: is it true, for a hash table `h`

, that

(equal? (list-ref (hash-values h) 0) (hash-ref h (list-ref (hash-keys h) 0)))

and so forth, for 1, 2, etc.?

The answer is: No, that is not necessarily true.

If, in some cases, it *is* true, that's accidental and not something to rely upon. The documentation for both functions says that the results are provided in an unspecified order

.

Think of it this way. When using `hash-keys`

and `hash-values`

, you're *losing information*. Applying these functions deliberately cuts the tie between the key and values of a hash. `hash-key`

gives just a list of keys; it makes no promises about the order of its results. And similarly for `hash-values`

.

## Demonstration

Here's how you can convince yourself of this. Run the following code in DrRacket:

#lang racket (define h (make-hash '(("a" . 0) ("b" . -1) ("c" . 4)))) (hash-keys h) ;; ("c" "a" "b") (hash-values h) ;; (-1 0 4), 'wrong' order

These results show that you can't really rely on the order. If you get results that don't contradict the conjecture, consider yourself lucky.