[Haskell-cafe] Very imperfect hash function
Hans Aberg
haberg at math.su.se
Sun Jan 31 15:04:40 EST 2010
On 31 Jan 2010, at 20:07, John Lato wrote:
>>> Or are you suggesting an actual hash table?
>>
>> The hash function folds the keys onto an interval. Since you have
>> Int values
>> k, you might just use a mod k n function for that.
>>
>>> If it's the
>>> latter, I'm not certain where the array fits into the picture. I'm
>>> pretty sure I'm missing something here.
>>
>> There is a module Data.HashTable. The array is just to make lookup
>> fast.
>> Like in:
>> ST s (STArray s HashKey (Map Key Value))
>
> I was misunderstanding your intention here. This is an interesting
> approach, but I would still try an IntMap first.
A simple hash-function for strings is to simply exclusive-or the bytes
and then reduce modulo a prime number, which will be the table size.
The average lookup time complexity is the one of the hash table. You
can then compare with the IntMap, which may have time complexity O(4),
the number of bytes in an Int32.
There might be a big difference in the constant factor, though: an
array seems to be much faster. I first made multivariate polynomial
division using lists, because it is easy to work with, and an example
of some stuff built on top took tens of seconds to run in Hugs. When
reworking it using STArray (mutable) and Array (immutable), it has no
noticeable delay.
Though I am using Map and Set, too, the choice of container seems
otherwise be dictated by what is most convenient to program.
Hans
More information about the Haskell-Cafe
mailing list