你如何完美地散列一个可能的 unicode 字符与一个 32 位整数的联合?

How do you perfectly hash a union of a possibly unicode char with a 32-bit integer?

我以前从来没有真正需要创建哈希函数,但现在它似乎是最好的解决方案。

我什么都没试过,但我想我首先要尝试的是将 unicode 整数作为 long 的最低有效 32 位进行哈希处理。然后在最重要的 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 是我想要散列的结构。它包含一个联合,我们应该对其进行散列以实现此目的。只是想知道我上面的方法是否正确。

感谢评论者。

   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);
   }