每Java文档中,哈希代码的String对象被计算为:
Run Code Online (Sandbox Code Playgroud)s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]使用
int算术,其中s[i]是 字符串的第i个字符,是字符串n的长度,并^指示取幂.
为什么31用作乘数?
我知道乘数应该是一个相对较大的素数.那么为什么不是29岁,37岁,甚至97岁?
引用 Eric Lippert的GetHashCode指南和规则:
规则:GetHashCode的消费者不能依赖它随着时间的推移或跨appdomains的稳定性
假设您有一个Customer对象,其中包含一系列字段,如Name,Address等.如果在两个不同的进程中使用完全相同的数据生成两个这样的对象,则它们不必返回相同的哈希代码.如果你在星期二的一个进程中创建这样一个对象,关闭它,并在星期三再次运行程序,哈希码可能会有所不同.
这在过去曾经被人咬伤过.System.String.GetHashCode的文档特别指出,两个相同的字符串在CLR的不同版本中可以具有不同的哈希码,实际上它们也是如此.不要在数据库中存储字符串哈希并期望它们永远是相同的,因为它们不会.
那么创建一个可以存储在数据库中的字符串的HashCode的正确方法是什么?
(请告诉我,我不是第一个在我写的软件中留下这个错误的人!)
我想在一个hashmap中存储一组对象,其中key应该是两个字符串值的组合.有没有办法实现这个目标?
我可以简单地连接两个字符串,但我确定有更好的方法来做到这一点.
我在C#中有一个Address类,如下所示:
public class Address
{
public string StreetAddress { get; set; }
public string RuralRoute { get; set; }
public string City { get; set; }
public string Province { get; set; }
public string Country { get; set; }
public string PostalCode { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我正在实现相等性,所以我需要覆盖哈希码.起初我打算使用EJ的哈希码公式,但后来我想:这些都是字符串字段,我不能只使用StringBuilder连接它们并从该字符串返回哈希码?
那是:
var str = new StringBuilder();
str.Append(StreetAddress)
.Append(RuralRoute)
...
return str.ToString().GetHashCode();
Run Code Online (Sandbox Code Playgroud)
这有什么优点/缺点?我为什么不这样做?
考虑我有一个POJO具有String类成员:
class POJO {
String name, address, emailId;
equals() {
}
hashCode() {
// How?
}
}
Run Code Online (Sandbox Code Playgroud)
如何将hashCode我的弦乐组合成一个hashCodePOJO?
通过"越来越多"我的意思是,Add当密钥数量较少时,开始时速度很快.插入20%的键后,它变得非常慢.在50%之后它变得无法忍受地缓慢.
我得到的是,键的数量越少,向字典添加新元素时"键碰撞搜索"的速度就越快.但有没有什么方法可以在保持这种情况的同时跳过这个缺点Dictionary?我事先知道密钥不会碰撞所以不需要检查,但我不知道是否有任何方法可以在代码中成功使用此信息.
顺便说一句,由于体系结构的限制,我不得不使用字典结构(这个结构后来被db导出器吞噬).
我的代码做了什么:
var keyList = GetKeyList();
var resultDict = new Dictionary<T,T>();
foreach (var key in keyList)
{
resultDict.Add(key,someResult);
}
Run Code Online (Sandbox Code Playgroud)
编辑:由于人们在询问如何生成哈希码,我将尝试澄清这一点.
从理论上讲,我无法控制哈希码生成,因为不幸的是它使用了通过同一个数据库连接的多个系统之间的约定.
在实践中,生成哈希码的代码片段确实是我的代码(免责声明:我不是选择在代中使用的约定).
密钥生成比这更复杂,但这一切都归结为:
private List<ResultKey> GetKeyList(string prefix, List<float> xCoordList, List<float> yCoordList)
{
var keyList = new List<ResultKey>();
var constantSensorName = "xxx";
foreach (float xCoord in xCoordList)
{
foreach (float yCoord in yCoordList)
{
string stationName = string.Format("{0}_E{1}N{2}", prefix, xCoord, yCoord);
keyList.Add(new ResultKey(constantSensorName, stationName));
}
}
return keyList;
}
public struct ResultKey
{
public …Run Code Online (Sandbox Code Playgroud) c# ×3
hashcode ×3
java ×3
hash ×2
string ×2
.net ×1
algorithm ×1
collections ×1
database ×1
dictionary ×1
equality ×1
gethashcode ×1
hashmap ×1
iequatable ×1
pojo ×1