0

我正在尝试编写一个哈希算法,它将成功地使用修饰键状态对 System.Windows.Input.Key 值进行哈希处理,例如:

ctrl = false
shift = true
alt = false
capslock = true
numlock = false
scroll lock = false
key: A

因此,像这样的键值应该与 ctrl、shift、alt 等具有不同状态的其他键值分开。但由于这些只是真或假,我不知道如何使其散列值区分开来?

有任何想法吗?它必须足够独特以处理所有可能的组合键。

4

1 回答 1

1

我将构建一个包含所有能够计算它自己的哈希码的值的类,例如:

    class KeyInfo : IEquatable<KeyInfo>
    {
        public bool Ctrl { get; private set; }
        public bool Shift { get; private set; }
        public bool Alt { get; private set; }
        public bool CapsLock { get; private set; }
        public bool NumLock { get; private set; }
        public bool ScrollLock { get; private set; }
        public Keys Key { get; private set; }

        public KeyInfo(bool ctrl, bool shift, bool alt, bool capsLock, bool numLock, bool scrollLock, Keys key)
        {
            this.Ctrl = ctrl;
            this.Shift = shift;
            this.Alt = alt;
            this.CapsLock = capsLock;
            this.NumLock = numLock;
            this.ScrollLock = scrollLock;
            this.Key = key;
        }

        public override bool Equals(object obj)
        {
            return this.Equals(obj as KeyInfo);
        }

        public bool Equals(KeyInfo other)
        {
            if (other == null)
                return false;
            return this.Ctrl == other.Ctrl && this.Shift == other.Shift &&
                   this.Alt == other.Alt && this.CapsLock == other.CapsLock &&
                   this.NumLock == other.NumLock && this.ScrollLock == other.ScrollLock &&
                   this.Key == other.Key;
        }

        public override int GetHashCode()
        {
            unchecked
            {
                int hash = 17;
                hash = hash * 23 + this.Ctrl.GetHashCode();
                hash = hash * 23 + this.Shift.GetHashCode();
                hash = hash * 23 + this.Alt.GetHashCode();
                hash = hash * 23 + this.CapsLock.GetHashCode();
                hash = hash * 23 + this.NumLock.GetHashCode();
                hash = hash * 23 + this.ScrollLock.GetHashCode();
                hash = hash * 23 + this.Key.GetHashCode();
                return hash;
            }
        }
    }

这归功于 Jon Skeet对实施的回答GetHashCode()

注意

此类可以有效地用作Dictionary键,进入HashSet或在 LINQDistinct()和其他 LINQ 集的操作中。

编辑:

我想强制执行这样一个事实,即您不能使用哈希码作为字典键,而是使用整个类。
您不能依赖哈希码的唯一性,因为对其进行哈希处理会发生冲突

于 2011-02-03T18:20:37.233 回答