正如我在标题中所写。
如果在应用程序中使用 getHashCode() 不安全,为什么要使用它? (对于字符串和整数)
我想用它来交叉方法并排除 Linq 模型中的方法
或创建我自己的 IEqualityCompare 类。
这感觉像是一个机会——如果它不是 100% 安全的话?
或者我错过了什么?
正如 String.GetHashCode 方法中引用的https://learn.microsoft.com/ https://learn.microsoft.com/
重要的
如果两个字符串对象相等,则 GetHashCode 方法返回相同的值。但是,每个唯一的字符串值都没有唯一的哈希码值。不同的字符串可以返回相同的哈希码。
哈希码本身不保证稳定。对于单个 .NET 版本,相同字符串的哈希代码在不同 .NET 实现、不同 .NET 版本以及不同 .NET 平台(例如 32 位和 64 位)之间可能有所不同。在某些情况下,它们甚至可能因应用程序领域而异。这意味着同一程序的两次后续运行可能会返回不同的哈希码。
因此,哈希码决不应该在其所在的应用程序域之外使用。
创建后,它们永远不应该用作集合中的关键字段,并且永远不应该持久化它们。
最后,如果出现以下情况,请勿使用哈希码代替加密哈希函数返回的值:
你需要一个加密强度高的哈希值。对于加密哈希,请使用派生自的类
System.Security.Cryptography.HashAlgorithm 或 System.Security.Cryptography.KeyedHashAlgorithm 类。
有关哈希码的更多信息,请参阅Object.GetHashCode。
我认为让您感到困惑的是您认为哈希码映射到值的地址,但事实并非如此。
将其想象为书架,哈希码映射到书架的地址。如果其中两本书的HashCode相同,就会被放在同一个书架上,并且有一个书架上有3本书的地址,字典只检查书架上的三本书,而不是所有的书。因此,哈希码越独特,字典查找的速度就越快。
当你创建时IEqualityComparer
如果你能做到GetHashCode()
为了返回唯一值,使用它的 Dictionary 或 HashSet 的执行速度会比有许多重复项时执行得更快。
检查这个例子:
public int GetShashCode(string ojb)
{
return obj.Length;
}
虽然它比循环整个字符串快得多,但它不是很独特(尽管它是有效的)
这个例子也是有效的,但甚至是一个更糟糕的选择:
public int GetShashCode(string ojb)
{
return (int)obj[0];
}
根据您可以猜测的字符串内容,您可以制作更好的哈希码(例如,您知道它是以下格式的社会安全号码:“XXX-XX-XXXX”,其中每个 X 代表一个数字)是一个不错的选择:
public int GetShashCode(string ojb)
{
return int.Parse(obj.Replace("-",""));
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)