Java 在hashcode中输入日期是一种好的做法吗?

Java 在hashcode中输入日期是一种好的做法吗?,java,date,map,hashcode,Java,Date,Map,Hashcode,我有多个记录有相似的id。数据库是非常遗留的。没有这样独特的专栏。Created date列用于保留数据库中创建行的时间戳。为了做一些操作,我必须在java map中保留记录。对于记录中的任何更改,它将创建新记录。我不想把所有字段都保存在hashcode和equals中。因为,我不确定哪个列是根据id更改的 首先,我尝试使用随机数生成器来生成唯一的哈希代码。它起作用了 其次,我决定将CreatedDate列放在hashcode中。它也起作用 将日期放在hashcode中有什么缺点吗?hashco

我有多个记录有相似的id。数据库是非常遗留的。没有这样独特的专栏。Created date列用于保留数据库中创建行的时间戳。为了做一些操作,我必须在java map中保留记录。对于记录中的任何更改,它将创建新记录。我不想把所有字段都保存在hashcode和equals中。因为,我不确定哪个列是根据id更改的

首先,我尝试使用随机数生成器来生成唯一的哈希代码。它起作用了

其次,我决定将CreatedDate列放在hashcode中。它也起作用


将日期放在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;
    }
}