$include_dir="/home/hyper-archives/boost/include"; include("$include_dir/msg-header.inc") ?>
From: Tobias Schwinger (tschwinger_at_[hidden])
Date: 2005-03-11 10:03:02
Daniel James wrote:
> Tobias Schwinger wrote:
> 
>> I am missing a way to parametrize how hash values are combined.
>> This is especially desirable because the skeleton could then be
>> exploited to implement double hashing for compound data (a comon
>> technique to avoid collisions by varying the hash function) and can be 
>> useful in other situations (e.g. a small hash table in memory vs. a 
>> large one on disk).
> 
> 
> I think if you want to combine hash values in a different manner, it's 
> best just write your own version of hash_combine. It could save a little 
> code if we supplied a version of hash_range that works for different 
> combining functions, but I don't think it'll be that useful (and would 
> require that your hash_combine function had the same signature as ours, 
> you might want to do it differently).
> 
Well, this was not exactly the point I was trying to make:
Example: let's say we have a disk-stored hash table and an in-memory 
hash table for caching. The same objects are stored but it is desirable 
to have two different hashing functions. Unfortunately boost::hash can 
only be used for at most one of them.
If I wanted to implement double hashing I'ld have to duplicate the whole 
facility (which may include writing a lot of "hash_value2" functions for 
a grown project) because there can be only one 'hash_value' per type 
which can only use one algorithm for combining the hash values, as the 
current design does not provide a way to get parametrization in there.
Looking at the source underlines this impression: hash_combine seems 
like a forgotten hard wired strategy in something that actually wants to 
be a facade.
>> The for loop in hash_float_value is a nice one to be unrolled via 
>> metaprogramming.
> 
> Yes, for anyone who hasn't looked at the code it loops a fixed number of 
> times based on the accuracy of the float type. Compilers could unroll 
> that loop themselves, but that's probably too much to expect.
> 
Especially since it is very questionable if these global 'unroll loops' 
options do any good in the big picture.
Regards,
Tobias