
Daniel James wrote:
Daniel James wrote:
Peter Dimov wrote:
For larger integer types, we probably need something along the lines of
std::size_t hash_value( val ) { size_t r = val;
while( val >>= size_t_bits ) { hash_combine( r, (size_t)val ); }
return r; }
It has the property of preserving the hash_value of all _values_ that can fit into a size_t, even though the underlying type is capable of holding bigger integers.
I don't think it does.
Actually, it does for positive number. Sorry I misread it. What you were doing clicked a couple of seconds after I clicked on 'send'. But I'm not sure it works for negative numbers.
You're right, it doesn't. It'd need a check against (size_t)-1 instead of 0 in the while loop. std::size_t hash_value( signed T val ) { unsigned T v2( val ); size_t r = v2; size_t s = val >= 0? 0: (size_t)-1; while( (size_t)(v2 >>= size_t_bits) != s ) { hash_combine( r, (size_t)v2 ); } return r; } or something like that. Now that I think about it, I'm not sure whether under the existing implementation -1 and -1L are guaranteed to hash to the same value, so it might not matter.