hash design problem: both string and int[] keys

Ali Çehreli acehreli at yahoo.com
Tue Nov 20 12:16:01 PST 2012


On 11/20/2012 11:39 AM, Charles Hixson wrote:

 > I'm trying to figure out how to construct an associative array whose
 > keys will be a combination of strings and immutable int[]'s, but every
 > approach I've looked at has run into problems.

Can you show some code?

 > It should be relatively
 > easy, as strings are really just an immutable list of ints,

A list of dchars is more accurate of course, but yes, dchar can be 
casted to int.

 > but I
 > haven't been able to find how strings are hashed. (It's looking as if
 > the details are handled in C...which makes it difficult.)

I bet the algorithm considers all of the characters of the strings. The 
following has been mentioned in a recent forum thread:

   http://eternallyconfuzzled.com/tuts/algorithms/jsw_tut_hashing.aspx

 > I could define
 > my own hash code, but I don't find it at all clear what would be
 > appropriate given that I don't know the size.

I wonder how much slow iterating over string would be, compared to 
directly accessing the elements of a dstring. (After all, strings must 
be decoded to produce dchars.)

In any case, you don't need the length of the string; a loop would do:

     while (!s.empty) {
         // ... use s.front and s.popFront() ...
     }

Alternatively:

     foreach (c; stride(s, 1)) {
         // ... use c ...
     }

UFCS looks better: :)

     foreach (c; s.stride(1)) {
         // ... use c ...
     }

 > The data is rather sparse,
 > so a hash table seems appropriate. (My only other alternative is a
 > database, and that imposes the heavy slowdown of I/O ... even though it
 > does automate persistence it doesn't seem like a good tradeoff.)
 >
 > So far my best idea is to build two tables, and then look at the key
 > when a retrieval is attempted to figure out which table it's in. That
 > would probably work, but it feels like a kludge.

How do you differentiate between the key type being int[] vs. string?

Ali



More information about the Digitalmars-d-learn mailing list