Thread overview
associativeArray.toHash()
Feb 22, 2007
Michiel
Feb 22, 2007
Michiel
Feb 22, 2007
Michiel
February 22, 2007
I'm now implementing the toHash() function of my new Set class. But I'm not sure how to extract hash-information from an associative array of which the key-type can be anything. The values are irrelevant. So you might see the problem as extracting hash-information from its .keys array.

I'm sure the hash-information of its key-type can be retrieved, since that's how the associative array works in the first place. How do I retrieve it manually?

Thanks!

-- 
Michiel
February 22, 2007
Michiel wrote:

> I'm now implementing the toHash() function of my new Set class. But I'm not sure how to extract hash-information from an associative array of which the key-type can be anything. The values are irrelevant. So you might see the problem as extracting hash-information from its .keys array.
> 
> I'm sure the hash-information of its key-type can be retrieved, since that's how the associative array works in the first place. How do I retrieve it manually?

I think I found a way in Phobos, but it might not be the most elegant one. I used std.boxer to pack each element of the array into a box. Then I call the Box.toHash() function on each and use the sum to calculate the sets hash.

Is there a better way?

It does seem to work. I can now have sets of sets of sets of whatever, and it still works as expected.

I'll continue to tweak the class a bit and then I'll publish it here.

-- 
Michiel
February 22, 2007
"Michiel" <nomail@please.com> wrote in message news:eritp3$d3j$1@digitalmars.com...
> Michiel wrote:
>
> I think I found a way in Phobos, but it might not be the most elegant one. I used std.boxer to pack each element of the array into a box. Then I call the Box.toHash() function on each and use the sum to calculate the sets hash.
>
> Is there a better way?

You can use the .getHash method of the typeinfo any type, and it'll use the built in hashing function.

class Set(T)
{
    ...
    T[] values; // or however you store them

    void someFunc(T data)
    {
        hash_t hash = typeid(T).getHash(&data);
    }
}


February 22, 2007
Jarrett Billingsley wrote:

>> I think I found a way in Phobos, but it might not be the most elegant one. I used std.boxer to pack each element of the array into a box. Then I call the Box.toHash() function on each and use the sum to calculate the sets hash.
>>
>> Is there a better way?
> 
> You can use the .getHash method of the typeinfo any type, and it'll use the built in hashing function.
> 
> class Set(T)
> {
>     ...
>     T[] values; // or however you store them
> 
>     void someFunc(T data)
>     {
>         hash_t hash = typeid(T).getHash(&data);
>     }
> }

That also works nicely! I tried something similar, just not exactly like that. Anyway, it's more elegant than my box way.

Thanks!

-- 
Michiel