Re: [boost] [review] hash functions

In-Reply-To: <007e01c52597$b62c1980$6601a8c0@pdimov> pdimov@mmltd.net (Peter Dimov) wrote (abridged):
pair<int, int>, int[2], struct { int a; int b; } are different representations of the same thing; it is not strictly necessary for them to use the same algorithm, but it's desirable and will eliminate a source of confusion and mistakes.
Really? What kind of mistakes? In my experience, if you want two different things to hash the same, you need to write their hash functions with that in mind. It is a special case which justifies not using the default hash function.
void hash_range( size_t & seed, It first, It last );
should this function be added. You are welcome to spell the above as
size_t hash_range( size_t seed, It first, It last );
I am also tempted by: size_t hash_range( It first, It last, size_t seed=0 ); perhaps replacing the 0 with some other default value. So people can ignore it if they don't need it. But doesn't this mean that hash_value( pair<int,int> ) also needs a seed argument, if you want it to match hash_range( int[2] ) ? -- Dave Harris, Nottingham, UK

Dave Harris wrote:
In-Reply-To: <007e01c52597$b62c1980$6601a8c0@pdimov> pdimov@mmltd.net (Peter Dimov) wrote (abridged):
pair<int, int>, int[2], struct { int a; int b; } are different representations of the same thing; it is not strictly necessary for them to use the same algorithm, but it's desirable and will eliminate a source of confusion and mistakes.
Really? What kind of mistakes?
In my experience, if you want two different things to hash the same, you need to write their hash functions with that in mind. It is a special case which justifies not using the default hash function.
Maybe, but this is not an argument for making the hash values different.
size_t hash_range( size_t seed, It first, It last );
I am also tempted by:
size_t hash_range( It first, It last, size_t seed=0 );
perhaps replacing the 0 with some other default value. So people can ignore it if they don't need it.
But doesn't this mean that hash_value( pair<int,int> ) also needs a seed argument, if you want it to match hash_range( int[2] ) ?
No. The seed version of hash_range is used when you want to compute the hash function of a sequence, but you don't have access to the whole sequence at once. It's goal is not to provide a way to change the initial seed, but to make it possible to continue from an intermediate seed.
participants (2)
-
brangdon@cix.compulink.co.uk
-
Peter Dimov