Как вы отлично хешируете объединение возможно Unicode-символа с 32-битным целым числом? - PullRequest
0 голосов
/ 14 января 2019

Раньше у меня никогда не было необходимости создавать хеш-функции, но сейчас это кажется лучшим решением для этого.

Я ничего не пробовал, но, наверное, сначала я бы попытался хешировать целое число в Юникоде как наименее значимое 32-битное значение long. Затем в старшем значащем 32-разрядном виде сохраните целое число.

struct Symbol
{
private:
   enum Type {
      Terminal,
      Variable,
   }
   union {
      char m_term;
      int m_var;
   }
   Type m_type;

public:
   this(char term) {
      m_type = Type.Terminal;
      m_term = term;
   }

   this(int var) {
      m_type = Type.Variable;
      m_var = var;
   }
}

Symbol - это структура, которую я хотел бы хэшировать. Он содержит союз, который мы должны хешировать для достижения этой цели. Было просто интересно, если мой подход выше верен.

1 Ответ

0 голосов
/ 15 января 2019

Спасибо комментаторам.

   bool opEquals(Symbol sym) const {
      if (m_type == Type.Terminal) 
         return m_term == sym.m_term;
      else
         return m_var == sym.m_var;
   }

   ulong toHash() {
      ulong bit = m_type;
      ulong key;
      if (m_type == Type.Terminal) 
         key = cast(ulong) m_term;
      else
         key = m_var;
      return bit | (key << 1);
   }
...