哈希01
// 什么是Hash
// Hash是否一个表结构----哈希表?
//Hash 是一个数据结构么?
// FNV 是一个简单的,理论上背过后可以手码
//Hash 是一类算法的总称
//解释:Hash,是一种算法,有非常多的哈希公式,又叫做,散列、杂凑、
// 把任意长度的输入,通过哈希算法变化成固定长度的输出,那么输出的那个值,就叫做哈希值
// 面试官问: 哈希是一种压缩映射?正确
//哈希表是什么? 哈希映射的实现,哈希表。。。表达不真确,但是表达了哈希的整体的意图
// 特点:只要输入相同,输出则相同
// 哈希碰撞,有可能输入不同,输出相同
// 哈希的常用内容
//MD5\dICTIONARY\Hashset、hashtable
HashSet<string> vs = new HashSet<string>();
Hashtable hashtable = new Hashtable();
// 常用的哈希函数
// 1 直接寻址 (A+B) 数字分析(算)、 平方区中、折中、余数、随机(随机数 )
// 推论:
// 还有 redis、加密算法、上数据库分布式、分布式事务、理论上只要涉及分布式,哈希是逃不掉的
// 为什么分布式必须得到所谓的哈希算法?
// 涉及一个问题:哈希一致性算法是怎么来的,为什么需要哈希一致性、
.net hashcode 会重复么,
.net hash 的简单使用
using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 哈希 { class Program { static void Main(string[] args) { Hashtable testHashes = new Hashtable(); //for (int i = 0; i < 3; i++) //{ // testHashes.Add(new TestHash() { Name="hnzheng",Age=111}.GetHashCode(),i); //} { List<TestHash> vs = new List<TestHash>(); vs.Add(new TestHash()); vs.Add(new TestHash()); // 数据不会调用gethascode 方法,数据组查询时,会将整个数组遍历,所以效率较差 } // 以下是哈希实现的;三种使用,当插入时先是根据hashcode 判断,相同是在调用equels 判断 { HashSet<TestHash> vs = new HashSet<TestHash>(); vs.Add(new TestHash()); vs.Add(new TestHash()); // 这里实际上直插入了一个,第二个被判断未同一个对象,未插入 } { Hashtable hashtable = new Hashtable(); // 第一次插入,调用GetHashCode(),返回111,能够插入 hashtable.Add(new TestHash(),"11"); // 第二次插入,调用GetHashCode() ,返回111,发现hashtable已经存在111, //再继续调用equels方法,进行比较,如果返回ture,说明是同一个对象,报错键值重复 hashtable.Add(new TestHash(), "11"); } { Dictionary<TestHash,string> dic = new Dictionary<TestHash,string>(); // 第一次插入,调用GetHashCode(),返回111,能够插入 dic.Add(new TestHash(), "11"); // 第二次插入,调用GetHashCode() ,返回111,发现hashtable已经存在111, //再继续调用equels方法,进行比较,如果返回ture,说明是同一个对象,报错键值重复 dic.Add(new TestHash(), "11"); } TestHash testHash = new TestHash(); TestHash testHash1 = new TestHash(); if (testHash.Equals(testHash1)) { } Console.ReadLine(); } } public class TestHash { public override int GetHashCode() { return 111; //return base.GetHashCode(); } public override bool Equals(object obj) { return true; } public string Name { get; set; } public int Age { get; set; } } }