你如何完美地散列一个可能的 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);
}
我以前从来没有真正需要创建哈希函数,但现在它似乎是最好的解决方案。
我什么都没试过,但我想我首先要尝试的是将 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);
}