将日期放在哈希码中是一种好习惯吗?

Sha*_*shi 2 java date map hashcode

我有多个具有类似身份的记录.数据库非常遗产.没有这样独特的专栏.创建日期列用于保留数据库中行的创建时间戳.我必须在java map中保留记录以进行一些操作.对于记录中的任何更改,它会创建新记录.我不想将所有字段保留在hashcode和equals中.因为,我不确定哪个列是针对id更改的.

首先,我尝试使用随机数生成器来获得唯一的哈希码.有用.

其次,我决定将创建的日期列放在哈希码中.它也有效.

将日期放在哈希码中是否有任何不利之处?

Pet*_*rey 7

hashCode和equals应使用相同的字段,这些字段应该是有效的不可变的(即在添加到散列集合后不会更改)

这可以包括您喜欢的日期或任何字段.

顺便说一下,我更喜欢使用long而不是Date因为我可以使它变得不可变而且速度稍慢.

如果您要使用时间戳作为id,您还可以通过向上推毫秒来确保它是唯一的(如果您可以存储这样的时间戳,则可以确保它是唯一的)

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

要么

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;
    }
}
Run Code Online (Sandbox Code Playgroud)