Nonportable code in C++ support

Matthew Woehlke mw_triad at users.sourceforge.net
Thu Feb 14 17:12:13 UTC 2008


Esben Mose Hansen wrote:
> On Wednesday 13 February 2008 17:13:16 Kuba Ober wrote:
>> On Wednesday 13 February 2008, Kris Wong wrote:
>>>> But since the hash-values are always 32 bit, won"t you then
>>>> get a warning when
>>>> casting long -> uint? :) Of course, any way of removing the
>>>> warning is fine.
>>> int hash = (int)((size_t)ptr + [whatever]);
>>>
>>> Let's not forget, longs are 4 bytes on 64 bit Windows.
>> Wouldn't this work better? It should be portable, too, although
>> it has a benign warning on 32 bits.
>>
>> void * ptr;
>> unsigned long lptr = (unsigned long)ptr;
>> lptr = (lptr >> 32) ^ (lptr & 0xffffffff);
>> int hash = (int)lptr;

I hate to say it, but this is one place I'd advocate the use of '#if 
PTR_SIZE > 4'...

>> The hash value on 32 bit platforms should be simply the value of the
>> pointer, while on 64 bits it will be the upper and lower halves xor-ed
>> together.
> 
> You mean, in the case you get many hash collisions across 4Gb of memory? 
> Personally, I'd go with the code from the c++ standard library:
> 
> return reinterpret_cast<std::size_t>(p);
> 
> except that the cast would be to int :) Simple, fast, and very likely to 
> return different values for different pointers, even modulo some number 
> 2^n-1.

I won't quote Kuba Ober, but to an extent I think he has a point (but 
that said, is a single hash-value collision here or there really so bad, 
so long as things are generally well-spread-out?). What I'd like to 
know, however, is why no one has mentioned the fact that a: malloc'd 
data is aligned to not less than PTR_SIZE bytes, and b: in general, the 
chances of having pointers stacked against each other is not very high 
(IOW, unless you're inserting pointers to consecutive entries in an 
array of small elements, you won't have pointers that differ by less 
than some modest amount).

In other words, stripping 2-4 bits off the bottom of the pointer to make 
the hash would seem like a sensible thing to do.

-- 
Matthew
Thus sang the fat lady...





More information about the KDevelop-devel mailing list