手机
当前位置:查字典教程网 >编程开发 >C#教程 >c#哈希算法的实现方法及思路
c#哈希算法的实现方法及思路
摘要:有想过hash["A1"]=DateTime.Now;这句是怎么实现的吗?我们来重温下学校时代就学过的哈希算法吧。我们要写个class,实现...

有想过hash["A1"] = DateTime.Now;这句是怎么实现的吗?我们来重温下学校时代就学过的哈希算法吧。

我们要写个class,实现如下主程序调用:

复制代码 代码如下:

static void Main(string[] args)

{

MyHash hash = new MyHash();

hash["A1"] = DateTime.Now;

hash["A2"] = 1;

Console.WriteLine(Convert.ToString(hash["A1"]));

Console.WriteLine(Convert.ToString(hash["A2"]));

}

一看,也确实挺简单的,就是一个所引器,如下:

复制代码 代码如下:

class MyHash

{

public object this[string key]

{

get

{

}

set

{

}

}

}

程序中要保存的对象,最终是要保存在一个数组中的,而且需要通过一个转换函数来进行string key与数组Index的Map,如下:

复制代码 代码如下:

private List<List<Tuple<string, object>>> lstArray = new List<List<Tuple<string, object>>>(defaultSize);

private int MapString2Int(string key)

{

int hashIndex=0;

char[] keyAry = key.ToCharArray();

foreach (var c in keyAry)

hashIndex += (int)c;

hashIndex = hashIndex % lstArray.Capacity;

return hashIndex;

}

这个函数是遍历string key的每个char,累加,最终取模(同数组的长度),这样得出的一个value肯定就在数组范围内。

如果2个key转换出来的index相同呢?会导致冲突,一个最简单的解决办法是把数组中的每个元素变成List, 也就是说,如果string key转换后出现了相同的Index,没关系,只要把那2个元素都放在那个Index所标识的数组位置中即可,本文中用的是List<Tuple<string, object>>。

下面是整个程序的代码:

复制代码 代码如下:

class Program

{

static void Main(string[] args)

{

MyHash hash = new MyHash();

hash["A1"] = DateTime.Now;

hash["A2"] = 1;

Console.WriteLine(Convert.ToString(hash["A1"]));

Console.WriteLine(Convert.ToString(hash["A2"]));

}

}

class MyHash

{

private const int defaultSize = 99999;

private List<List<Tuple<string, object>>> lstArray = new List<List<Tuple<string, object>>>(defaultSize);

public MyHash()

{

int i = lstArray.Capacity;

while(i>=0)

{

lstArray.Add(new List<Tuple<string,object>>());

i--;

}

}

public object this[string key]

{

get

{

EnsureNotNull(key);

List<Tuple<string, object>> lst;

Tuple<string, object> obj = FindByKey(key, out lst);

if (obj == null)

throw new Exception("Key不存在");

return obj.Item2;

}

set

{

EnsureNotNull(key);

List<Tuple<string, object>> lst;

Tuple<string, object> obj = FindByKey(key, out lst);

if (obj!=null)

lst.Remove(obj);

lst.Add(new Tuple<string, object>(key, value));

}

}

private Tuple<string, object> FindByKey(string key, out List<Tuple<string, object>> lst)

{

int hashIndex = MapString2Int(key);

lst = lstArray[hashIndex];

Tuple<string, object> obj = null;

for (var i = 0; i < lst.Count; i++)

{

if (lst[i].Item1 == key)

{

obj = lst[i];

break;

}

}

return obj;

}

private static void EnsureNotNull(string key)

{

if (key == null || key.Trim().Length == 0)

throw new Exception("Key不能为空");

}

private int MapString2Int(string key)

{

int hashIndex=0;

char[] keyAry = key.ToCharArray();

foreach (var c in keyAry)

hashIndex += (int)c;

hashIndex = hashIndex % lstArray.Capacity;

Console.WriteLine(string.Format("{0}相应的Index为:{1}", key, hashIndex));

return hashIndex;

}

}

运行效果图:

c#哈希算法的实现方法及思路1

【c#哈希算法的实现方法及思路】相关文章:

c#解压文件的实例方法

在C#中创建和读取XML文件的实现方法

解决C#全屏幕截图的实现方法

.NET单点登陆的实现方法及思路

C#几种截取字符串的方法小结

C#中控制远程计算机的服务的方法

c#创建Graphics对象的三种方法

C#注释的一些使用方法浅谈

C# 鼠标穿透窗体功能的实现方法

基于c#图像灰度化、灰度反转、二值化的实现方法详解

精品推荐
分类导航