On Sunday, 20 October 2013 at 22:04:49 UTC, Agustin wrote:
On Sunday, 20 October 2013 at 21:54:37 UTC, Agustin wrote:
On Sunday, 20 October 2013 at 02:14:55 UTC, TheFlyingFiddle wrote:
Anyway to evaluate the name of the class and return its hash at compile time?

I couldn't find the built in hash unction for strings so i used the one from http://dlang.org/hash-map.html as an example. More advanced and better hash functions can be found online.

public class ComponentDetail(T) : Component {
        ////////////////////////////////////////////////////////////
        /// Component's ID as static member.
        public static hash_t ID = hash!(T);
}

hash_t hash(T)()
{
  hash_t hash;
  foreach (char c; T.stringof)
      hash = (hash * 9) + c;
  return hash;
}

Works perfectly :), now if i want to implement the same but
rather do something like

template GetHash(string character, hash_t hash = 0, size_t index
= 0) {
        static if (character[index])
                enum GetHash = GetHash(character, hash = (hash * 9) +
character[index], ++index);
        else
                enum GetHash = hash;
}

How should i implement it?

I came up with something like


template GetHash(string character, hash_t hash = 0, size_t index = 0) {
        static if (index < character.length)
enum GetHash = GetHash!(character, (hash * 9) + character[index], index + 1);
        else
                enum GetHash = hash;
}

And the final template is

template Hash(string text, hash_t hash = 0, size_t index = 0) {
        static if (index < text.length)
enum Hash = Hash!(text, (hash ^ text[index]) * 1099511628211UL, index + 1);
        else
                enum Hash = hash;
}

:D

Reply via email to