首页 / 知识
关于哈希:如何从C#中的字节数组生成哈希码?
2023-04-12 12:43:00

How do I generate a hashcode from a byte array in C#?假设我有一个存储字节数组的对象,并且希望能够有效地为其生成哈希码。 过去,我已经使用了加密哈希函数,因为它们易于实现,但是它们的工作量远远超过了以单向加密的方式,而且我对此并不在乎(我只是在使用 哈希码作为哈希表的键)。 这是我今天所拥有的:
有什么想法吗?
dp:没错,我错过了Equals支票,我已经对其进行了更新。 使用字节数组中的现有哈希码将导致引用相等(或至少将相同的概念转换为哈希码)。
使用该代码,尽管两个字节数组在其中具有相同的值,但它们引用的是内存的不同部分,并且将导致(可能)不同的哈希码。 我需要具有相同内容的两个字节数组的哈希码相等。 对象的哈希码不需要唯一。 检查规则为:
您想要的只是一个 您希望数据多长时间?如何随机?如果长度变化很大(例如文件),则只需返回长度即可。如果长度可能相似,则查看变化的字节子集。
两个相同的事物绝对不能具有不同的哈希码。两个不同的对象不应具有相同的哈希码,但是可能会发生一些冲突(毕竟,比可能的32位整数有更多的排列)。 不要将加密哈希用于哈希表,这太荒谬了。 你们去...在C#中修改了FNV哈希 http://bretm.home.comcast.net/hash/6.html
借用JetBrains软件生成的代码,我决定使用此功能:
仅对字节进行异或运算的问题在于,返回值的3/4(3个字节)只有2个可能的值(全部打开或全部关闭)。这会使位散布得更多。 在Equals中设置断点是一个很好的建议。将我的数据的大约200,000个条目添加到Dictionary中,可以看到大约10个Equals调用(或1 / 20,000)。 我发现了有趣的结果: 我上课:
然后,我创建了一个具有MyHash类型的键的字典,以测试插入的速度以及我还知道有多少次碰撞。我做了以下
每当我在字典中插入新项目时,字典都会计算该对象的哈希值。因此,您可以通过在
花了2秒钟来执行。方法
也没有碰撞,但是花了7秒钟执行! 您是否将其与SHA1CryptoServiceProvider.ComputeHash方法进行了比较?它需要一个字节数组并返回SHA1哈希,我相信它已经很好地优化了。我在一个Identicon处理程序中使用它,该程序在负载下表现良好。 无论您是想要一个完美的哈希函数(每个对象的值都相等)还是一个不错的哈希函数,始终都是性能的折衷,通常需要时间来计算一个好的哈希函数,如果您的数据集很小,那么您最好快速功能。最重要的是正确性(正如您在第二篇文章中所指出的那样),要实现这一目标,您需要返回数组的Length。根据您的数据集,可能还可以。如果不是(例如,所有数组都一样长),则可以使用一些便宜的东西,例如查看第一个和最后一个值并对它们的值进行XOR,然后添加更多的复杂性(如认为适合您的数据)。 查看哈希函数如何对数据执行的一种快速方法是将所有数据添加到哈希表中,并计算调用Equals函数的次数,如果这种情况经常发生,则您需要对该函数进行更多的工作。如果执行此操作,请记住,哈希表的大小必须在开始时设置为大于数据集的大小,否则将重新哈希数据,这将触发重新插入和更多的Equals评估(尽管可能更现实吗?) 对于某些对象(不是这个对象),可以通过ToString()。GetHashCode()生成快速的HashCode,这当然不是最佳方法,但是由于人们倾向于从ToString()返回与对象的身份相似的东西,因此很有用。 GetHashcode在寻找什么 Trivia:我见过的最糟糕的性能是有人错误地从GetHashCode返回了一个常量,尽管很容易通过调试器发现,特别是如果您在哈希表中进行大量查找时 生成良好的哈希值说起来容易做起来难。记住,您基本上是用m位信息表示n字节数据。数据集越大,m越小,发生冲突的可能性就越大……将两个数据解析为相同的哈希。 我所学到的最简单的哈希是将所有字节异或。它比大多数复杂的哈希算法简单易行,而且比用于小型数据集的中途通用哈希算法要快。这实际上是Bubble Sort的哈希算法。由于简单的实现将使您剩下8位,因此只有256个散列...并不是那么热。您可以对块进行XOR运算,而不是单个字节,但随后算法变得更加复杂。 因此,可以肯定的是,密码算法可能正在做一些您不需要的事情……但是它们在通用哈希质量上也有了巨大的进步。您正在使用的MD5哈希具有128位,并且可能有数十亿个哈希。您可能会得到更好的改进的唯一方法是对您希望通过应用程序进行数据处理的一些代表性样本,并在其上尝试各种算法,以查看遇到了多少冲突。 因此,在我看到不使用固定哈希算法的某些理由(也许是性能?)之前,我将不得不建议您坚持使用现有的技术。 使用字节数组字段中的现有哈希码还不够好吗?另请注意,在进行比较之前,应使用Equals方法检查数组的大小是否相同。
如果您正在寻找性能,我测试了一些哈希键,并且
我根本不了解C#,也不知道它是否可以与C链接,但是
RuntimeHelpers.GetHashCode可能会帮助:
|
最新内容
相关内容
python函数里面形参和实参一样吗?
python函数里面形参和实参一样吗?,培训,函数,参数,里面,变量,实际,形式,全称,示例,后面,python函数里面形参和实参不一样。形参全称是形式参python的闭包函数是什么
python的闭包函数是什么,代码,工作,函数,培训,程序,外部,个数,变量,嵌套,赋值,python中的闭包,又称闭包函数或者闭合函数,其实和前面讲的嵌套函python脚本怎么自动生成文件
python脚本怎么自动生成文件,工作,名字,通用,培训,文件,脚本,内容,参数,关系,中将,python脚本自动生成需要文件在工作中我们经常需要通过一个python如何定义函数
python如何定义函数,培训,概念,代码,环境,函数,定义,语句,括号,结果,冒号,函数的概念:函数是组织好的、具有一定功能的代码片段。在Python中,定python类是函数吗?
python类是函数吗?,代码,数据,培训,公用,名称,函数,变量,方法,实例,圆括号,python类(Class):用来描述具有相同的属性和方法的对象的集合。它定pythonid函数如何运行
pythonid函数如何运行,培训,地址,代码,对象,函数,内存,类型,可能会,整数,字符串,id(object)功能:返回的是对象的“身份证号”,唯一且不变,但在不python函数嵌套时怎么调用
python函数嵌套时怎么调用,培训,函数,周期,变量,嵌套,作用,定义,里面,上层,也就是说,python允许创建嵌套函数。也就是说我们可以在函数里面定python如何定义接受参数的函数
python如何定义接受参数的函数,信息,培训,位置,参数,函数,列子,效果,定义,更多,内容,python中的函数可以有参数,也可以无参数,参数可以分为默认python类和对象的区别是什么
python类和对象的区别是什么,培训,主体,汽车,状态,对象,定义,属性,方法,实例,区别,类和对象1、类和对象得区别:类是对客观世界中事物得抽象,而pythonmap函数怎么显示结果
pythonmap函数怎么显示结果,培训,代码,数字,函数,结果,序列,元素,参数,可能会,惰性,map()函数接收两个参数,一个是函数,一个是Iterable,map将传pythonstr函数怎么用
pythonstr函数怎么用,培训,函数,字符串,整数,参数,列表,示例,初始化,变量,字典,str函数是Python的内置函数,其语法格式为str(object)返回值:返python没有main函数吗
python没有main函数吗,入口,代码,培训,位置,方法,函数,文件,程序,都会,属性,相信很多初学python的人看代码的时候都会先找一下main()方法,从ma