C# 如何在列表框中显示字符串的哈希值?
我有一个项目,我必须创建自己的线性散列、桶散列和二次散列算法,所以我选择散列一些字符串,但我遇到了一个小问题,我有两个列表框:C# 如何在列表框中显示字符串的哈希值?,c#,winforms,hash,string-hashing,C#,Winforms,Hash,String Hashing,我有一个项目,我必须创建自己的线性散列、桶散列和二次散列算法,所以我选择散列一些字符串,但我遇到了一个小问题,我有两个列表框: 满是字符串的列表框 一个列表框,其中充满了这些字符串的散列 我可以毫无问题地打印字符串,但当我单击按钮时,我不知道如何将它们对应的哈希打印到另一个列表框中 这是我的密码: Form.cs private void btnLinearHash\u单击(对象发送方,事件参数e) { //初始化Hash.cs(代码见下文) Hash.LinearHash LinearHa
- 满是字符串的列表框
- 一个列表框,其中充满了这些字符串的散列
private void btnLinearHash\u单击(对象发送方,事件参数e)
{
//初始化Hash.cs(代码见下文)
Hash.LinearHash LinearHash=新的Hash.LinearHash();
RandomArrayGen randGen=新的RandomArrayGen();
//清除两个列表框
lbHashStrings.Items.Clear();
lbHashesOfStrings.Items.Clear();
对于(int i=0;i<12;i++)
{
//使用RandomArrayGen.cs生成12个随机大小写字符串(请参见https://pastebin.com/jRsG5r1E)
lbHashStrings.Items.Add(randGen.GenRandomStrings(12,true,true));
}
对于(int i=0;i
Hash.cs
公共类LinearHash
{
专用字典linearharray=新字典();
专用字节[]哈希码;
public void GenerateHashOfString(字符串stringToHash)
{
hashCode=Encoding.ASCII.GetBytes(stringToHash);
添加(hashCode,stringToHash);
}
公共字符串FindHashCodeIndicationary(字符串StringToFind)
{
byte[]HashOfStringToFind=Encoding.ASCII.GetBytes(StringToFind);
//出于某种原因,这会不断返回false
foreach(linearharray中的var keyPairValue)
{
if((linearharray.ContainsKey(HashOfStringToFind)和&linearharray.ContainsValue(StringToFind))
{
返回Encoding.UTF8.GetString(HashOfStringToFind);
}
}
返回“未找到散列”;
}
}
所以,我的问题是:我做错了什么?为什么Hash.cs中的foreach返回false?我通过使用BitConverter.ToString(hashToConvert.Replace(“-”,string.Empty);转换字节[]解决了我的问题 Hash.cs
你在字典里查找匹配项,你有没有在“FindHashCodeIndicator”处破译你的代码来检查它是否真的存在部分?如果您尝试使用
Equals
来比较两个字节数组,它将进行引用比较,而不是内容比较。因为这两个数组在内存中是分开的,它们有不同的引用。@BugFinder:是的。我查找的字符串和哈希都可以在字典中找到。@MatthewWatson:我明白了。我如何解决这个问题?我不知道请注意:if((linearHashArray.ContainsKey(HashOfStringToFind)和&linearharray.ContainsValue(StringToFind))
为什么要重新缓存和比较,而不仅仅是查找散列字符串?这样会使代码更简单
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()));
}
}
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";
}
}
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;
}