Java 在hashcode中输入日期是一种好的做法吗?
我有多个记录有相似的id。数据库是非常遗留的。没有这样独特的专栏。Created date列用于保留数据库中创建行的时间戳。为了做一些操作,我必须在java map中保留记录。对于记录中的任何更改,它将创建新记录。我不想把所有字段都保存在hashcode和equals中。因为,我不确定哪个列是根据id更改的 首先,我尝试使用随机数生成器来生成唯一的哈希代码。它起作用了 其次,我决定将CreatedDate列放在hashcode中。它也起作用Java 在hashcode中输入日期是一种好的做法吗?,java,date,map,hashcode,Java,Date,Map,Hashcode,我有多个记录有相似的id。数据库是非常遗留的。没有这样独特的专栏。Created date列用于保留数据库中创建行的时间戳。为了做一些操作,我必须在java map中保留记录。对于记录中的任何更改,它将创建新记录。我不想把所有字段都保存在hashcode和equals中。因为,我不确定哪个列是根据id更改的 首先,我尝试使用随机数生成器来生成唯一的哈希代码。它起作用了 其次,我决定将CreatedDate列放在hashcode中。它也起作用 将日期放在hashcode中有什么缺点吗?hashco
将日期放在hashcode中有什么缺点吗?hashcode和equals应该使用相同的字段,并且这些字段应该是有效不可变的(即添加到哈希集合后不会更改) 这可以包括日期或您喜欢的任何字段 顺便说一句,我更喜欢使用
long
而不是Date
,因为我可以使它不可变,而且速度稍微快一些
如果要使用时间戳作为id,还可以通过向上推毫秒(或微秒,如果可以存储这样的时间戳)来确保它是唯一的
private static final AtomicLong TIME_STAMP=new AtomicLong();
//每秒最多可以有1000个ID。
公共静态长getUniqueMillis(){
long now=System.currentTimeMillis();
while(true){
long last=TIME_STAMP.get();
如果(现在如果你把某个东西放在一个映射中,那么我假设你以后想用键来获取它。键的HashCode()用于标识元素所属的bucket。然后对bucket中的所有元素使用equals()方法来查找匹配项。通过为HashCode()使用一个随机数生成器您将无法在映射中找到键,因为如果键没有更改,hashcode()函数每次都应返回相同的值。首先,如果在HashMap
中将这些对象用作键,则只需要equals()
和hashcode()
方法
必须有某种概念来确定这些对象彼此“相等”意味着什么。您必须以反映此概念的方式实现equals()
和hashCode()
方法
使用随机数作为散列码是个坏主意,除非equals()
总是返回false
(所以,没有两个对象是彼此相等的)。即使如此,每次调用hashCode()
时,当然也不能返回新的随机数(当您将对象存储在基于散列的集合中时,这将导致奇怪的错误)
使用日期作为hashCode()
计算的一部分没有问题,只要它是确定两个对象是否彼此相等的标准之一。或HashSet
(这是一个带有集合的HashMap
).@BoristheSpider或任何其他基于哈希的集合。哈希代码由java中基于哈希的集合使用。它们必须不同,才能使基于哈希的集合更快地工作。因此,如果您想了解hashmap的更多信息,请参阅hashset
private static final AtomicLong TIME_STAMP = new AtomicLong();
// can have up to 1000 ids per second.
public static long getUniqueMillis() {
long now = System.currentTimeMillis();
while (true) {
long last = TIME_STAMP.get();
if (now <= last)
now = last + 1;
if (TIME_STAMP.compareAndSet(last, now))
return now;
}
}
private static final AtomicLong TIME_STAMP = new AtomicLong();
// can have up to 1000000 ids per second.
public static long getUniqueMicros() {
long now = System.currentTimeMillis() * 1000;
while (true) {
long last = TIME_STAMP.get();
if (now <= last)
now = last + 1;
if (TIME_STAMP.compareAndSet(last, now))
return now;
}
}