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