Can someone please explain why the following assertion fails?
Ali Çehreli via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Mon Oct 31 12:24:13 PDT 2016
On 10/31/2016 12:08 PM, Gary Willoughby wrote:
> Can someone please explain why the following assertion fails?
>
> import std.stdio;
> import std.conv;
>
> void main(string[] args)
> {
> auto x = 1;
>
> assert(hashOf(x.to!(string)) == hashOf(x.to!(string)));
> }
>
> Thanks.
Because it considers the .ptr property of arrays as well:
https://github.com/dlang/druntime/blob/master/src/core/internal/hash.d#L61
//dynamic array hash
size_t hashOf(T)(auto ref T val, size_t seed = 0)
if (!is(T == enum) && !is(T : typeof(null)) && is(T S: S[]) &&
!__traits(isStaticArray, T)
&& !is(T == struct) && !is(T == class) && !is(T == union))
{
alias ElementType = typeof(val[0]);
static if (is(ElementType == interface) || is(ElementType == class) ||
((is(ElementType == struct) || is(ElementType == union))
&& is(typeof(val[0].toHash()) == size_t)))
//class or interface array or struct array with toHash(); CTFE
depend on toHash() method
{
size_t hash = seed;
foreach (o; val)
{
hash = hashOf(o, hash);
}
return hash;
}
else static if (is(typeof(toUbyte(val)) == const(ubyte)[]))
//ubyteble array (arithmetic types and structs without toHash) CTFE
ready for arithmetic types and structs without reference fields
{
auto bytes = toUbyte(val);
return bytesHash(bytes.ptr, bytes.length, seed); // <-- HERE
}
else //Other types. CTFE unsupported
{
assert(!__ctfe, "unable to compute hash of "~T.stringof);
return bytesHash(val.ptr, ElementType.sizeof*val.length, seed);
}
}
Ali
More information about the Digitalmars-d-learn
mailing list