a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

首頁 > 編程 > C# > 正文

c#哈希算法的實現方法及思路

2020-01-24 03:01:54
字體:
來源:轉載
供稿:網友

有想過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;
        }
    }

運行效果圖:

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 国产精品日韩一区二区 | 精品日韩 | 久久久高清视频 | 一级黄视频 | 久久国产精品免费一区二区三区 | www.99精品| 久久国产精品99久久久久久老狼 | 成人黄色一级片 | 在线免费自拍 | 亚洲免费在线视频 | 在线观看国产一级片 | 玖玖精品 | 黄色污网 | 亚洲国产精品久久 | jizz欧美最大 | 中文字幕爱爱视频 | 日本xxxxx片免费观看19 | 国产亚洲一区二区三区 | 久久呻吟 | 久久成人一区 | 日本aⅴ免费视频一区二区三区 | 成人久久久精品乱码一区二区三区 | 国产欧美日韩综合精品 | 九九九九九九精品 | 国产一区二区三区久久99 | 欧美高清在线一区 | 久久在线视频 | 国产男女免费完整视频 | japanhd熟睡侵犯 | 一级黄视频 | 亚洲激情在线 | 久久99精品久久久噜噜最新章节 | 免费成人av网 | 日韩一区欧美一区 | 搜一级毛片 | av在线一区二区三区 | 成人免费视频网站 | 天天操夜夜拍 | 午夜视频在线观看免费视频 | 中文字幕av亚洲精品一部二部 | 欧美视频二区 |