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

时间:2023-10-22 01:48:08 

有想过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#哈希算法的实现方法及思路

标签:c#,哈希算法
0
投稿

猜你喜欢

  • Java集合去重导致的线上问题

    2022-01-24 04:52:29
  • Java 实战项目之精美物流管理系统的实现流程

    2023-10-30 19:53:46
  • 你真的知道Java中对象的销毁吗

    2022-09-14 22:31:38
  • java ArrayList和Vector的区别详解

    2023-03-08 14:47:05
  • java结合HADOOP集群文件上传下载

    2022-12-14 23:08:52
  • JavaSwing FlowLayout 流式布局的实现

    2023-10-02 03:59:41
  • Android中ActionBar以及menu的代码设置样式

    2023-11-24 03:34:33
  • Spring Boot2发布调用REST服务实现方法

    2023-12-10 20:03:49
  • Spring JPA 增加字段执行异常问题及解决

    2023-06-25 23:55:58
  • java不同版本在多线程中使用随机数生成器的实现

    2022-01-02 22:57:07
  • C++ 二维(多维)vector添加一个空项问题

    2022-10-10 14:44:23
  • Java常用锁synchronized和ReentrantLock的区别

    2023-06-01 04:42:21
  • 理解zookeeper选举机制

    2023-04-15 20:09:44
  • Java完美实现2048小游戏

    2023-06-14 12:59:25
  • C语言实现俄罗斯方块源代码

    2023-02-28 13:16:45
  • 浅谈Java方法调用的优先级问题

    2023-07-01 13:40:08
  • Android单片机与蓝牙模块通信实例代码

    2023-02-21 17:21:05
  • android studio生成aar包并在其他工程引用aar包的方法

    2021-07-23 21:28:30
  • Feign如何实现第三方的HTTP请求

    2023-06-10 16:20:20
  • Java多线程编程之访问共享对象和数据的方法

    2022-10-01 07:05:02
  • asp之家 软件编程 m.aspxhome.com