Article: Increasing the D Compiler Speed by Over 75%

Dmitry Olshansky dmitry.olsh at gmail.com
Wed Jul 31 01:49:40 PDT 2013


30-Jul-2013 22:22, Walter Bright пишет:
> On 7/30/2013 11:02 AM, Dmitry Olshansky wrote:

>>
>> What bothers me is that while I've been hacking at this I couldn't
>> shake off the
>> feeling that AA code assumes NO FULL HASH COLLISIONS at all?
>
> I don't know what you mean, as it has a collision resolution system. See
> embedded code below.

Yes but it does so using full _hash_ alone.
Basically Key is size_t, if we store strings in this AA and they hash to 
exactly the same size_t "key" then you'll never find one of them.


>> Value _aaGetRvalue(AA* aa, Key key)
>> {
>>      //printf("_aaGetRvalue(key = %p)\n", key);
>>      if (aa)
>>      {
>>          size_t i;
>>          size_t len = aa->b_length;
>>          if (len == 4)
>>              i = (size_t)key & 3;
>>          else if (len == 31)
>>              i = (size_t)key % 31;
>>          else
>>              i = (size_t)key % len;
>>          aaA* e = aa->b[i];

***   ^^^ obviously key is only a hash value ***

>>          while (e)
>>          {
>>              if (key == e->key)
>>                  return e->value;
>>              e = e->next;
>
> **** ^^^ collision resolution code ^^^ *****


Here key is 32 bits. Surely 2 strings can hash to the exact same 32 bit 
value. This resolves only slot collision. It doesn't resolve full hash 
collision.

>
>>          }
>>      }
>>      return NULL;    // not found
>> }
>
>


-- 
Dmitry Olshansky


More information about the Digitalmars-d-announce mailing list