【问题标题】:How do I show the hash of a string in a ListBox?如何在 ListBox 中显示字符串的哈希值?
【发布时间】:2017-08-31 00:53:24
【问题描述】:

我有一个项目,我必须创建自己的线性散列、桶散列和二次散列算法,所以我选择散列一些字符串,但我遇到了一个小问题,我有 2 个 ListBox:

  • 一个充满字符串的列表框
  • 一个列表框,里面装满了这些字符串的哈希值

我可以毫无问题地打印字符串,但是当我单击一个按钮时,我不知道如何将它们对应的哈希值打印到另一个 ListBox 中。

这是我的代码:

Form.cs

private void btnLinearHash_Click(object sender, EventArgs e)
{
    // Initialize Hash.cs (see below for code)
    Hash.LinearHash linearHash = new Hash.LinearHash();
    RandomArrayGen randGen = new RandomArrayGen();

    // Clear both ListBoxes
    lbHashStrings.Items.Clear();
    lbHashesOfStrings.Items.Clear();

    for (int i = 0; i < 12; i++)
    {
        // Generate 12 random upper and lowercase strings using RandomArrayGen.cs (see https://pastebin.com/jRsG5r1E)
        lbHashStrings.Items.Add(randGen.GenRandomStrings(12, true, true));
    }

    for (int i = 0; i < lbHashStrings.Items.Count; i++)
    {
    // Generate a hash of a string and store it into a Dictionary (see Hash.cs)
    linearHash.GenerateHashOfString(lbHashStrings.Items[i].ToString());
    lbHashesOfStrings.Items.Add(linearHash.FindHashCodeInDictionary(lbHashStrings.Items[i].ToString()));
    }
}

哈希.cs

    public class LinearHash
    {
        private Dictionary<byte[], string> linearHashArray = new Dictionary<byte[], string>();
        private byte[] hashCode;

        public void GenerateHashOfString(string stringToHash)
        {
            hashCode = Encoding.ASCII.GetBytes(stringToHash);

            linearHashArray.Add(hashCode, stringToHash);
        }

        public string FindHashCodeInDictionary(string StringToFind)
        {
            byte[] HashOfStringToFind = Encoding.ASCII.GetBytes(StringToFind);

            //For some reason, this keeps returning false
            foreach (var keyPairValue in linearHashArray)
            {
                if ((linearHashArray.ContainsKey(HashOfStringToFind) && linearHashArray.ContainsValue(StringToFind))
                {
                    return Encoding.UTF8.GetString(HashOfStringToFind);
                }
            }
            return "Hash not found";
        }
    }

所以,我的问题是:我做错了什么?为什么Hash.cs中的foreach返回false?

【问题讨论】:

  • 您正在字典中查找匹配项,您是否通过在“findhashcodeindictonary”部分破坏您的代码来检查它是否确实存在?
  • 如果您尝试使用Equals 比较两个字节数组,它将进行引用比较,而不是内容比较。由于这两个数组在内存中是分开的,所以它们有不同的引用。
  • @BugFinder:是的。我查找的字符串和哈希都可以在字典中找到。
  • @MatthewWatson:我明白了。我该如何解决这个问题?我试过这个:if ((linearHashArray.ContainsKey(HashOfStringToFind) &amp;&amp; linearHashArray.ContainsValue(StringToFind)))
  • 为什么要重新哈希和比较,而不仅仅是查找哈希字符串?它会让你的代码更简单

标签: c# winforms hash string-hashing


【解决方案1】:

我通过使用 BitConverter.ToString(hashToConvert).Replace("-", string.Empty); 转换 Byte[] 解决了我的问题。

哈希.cs

    public void GenerateHashOfString(string stringToHash)
    {
        hashCode = Encoding.ASCII.GetBytes(stringToHash);
    ==> hashCodeInStringForm = BitConverter.ToString(hashCode).Replace("-", string.Empty);

        linearHashArray.Add(hashCode, stringToHash);
    }

    public string FindHashCodeInDictionary(string StringToFind)
    {
    byte[] HashOfStringToFind = Encoding.ASCII.GetBytes(StringToFind);

    foreach (var hashCode in linearHashArray)
    {
        if (!linearHashArray.ContainsKey(HashOfStringToFind) && !linearHashArray.ContainsValue(StringToFind))
        {
        return "String and hash not found in array";
        }
    }
    return hashCodeInStringForm;
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-26
    • 2017-08-10
    • 1970-01-01
    • 1970-01-01
    • 2011-12-02
    • 2011-03-26
    • 1970-01-01
    相关资源
    最近更新 更多