繁体   English   中英

如何从相同的值生成唯一ID

[英]How to generate Unique ID from same values

我需要找到一种方法,使一组值将始终生成相同的ID,并且它必须是唯一的。

这样做的主要原因是为了加快查询速度,在我需要进行大量联接之前,只能进行一次比较。 我知道我的领域,遗憾的是这些价值并未封闭(即,它们可以是任何东西)。

我尝试使用哈希,但是根据定义,哈希函数不能保证唯一性。 有办法吗?

编辑:更多上下文

我正在一个将来自不同设备的事件关联的系统中工作。

通过一些“事件”属性来计算相关性:

  • 它来自哪里。
  • 这是什么样的事件。
  • 来自它的价值,并且在不同的群体中具有不同的同类事件。

例如,考虑这样的事情。 想象我的设备是冰箱。 它发送有关温度和内部食物的事件。 因此,假设我们按以下顺序接收事件:

Event1: {type: temperature, values: [{temperature: -1]}
Event2: {type: food, values: [{group: vegetable, name: brocollis, quantity: 2, weight: 0.1]}
Event3: {type: food, values: [{group: vegetable, name: lettuce, quantity: 1,  weight: 0.1]}
Event4: {type: temperature, values: [{temperature: -5]}

temperature类型的所有事件都必须相关,但是food类型的相关性也从其namegroup得出。 即,相关标识符的数量是可变的。

这些相关性保存在这样的结构中

@Entity
public class EventCorrelation {
    @Id @GeneratedValue
    @Audit
    private Long id;

    @ElementCollection
    @CollectionTable(
       name = "evt_corr_extra_id",
       joinColumns = @JoinColumn(name = "correlation_id"))
    @Column(name = "extra_id")
    @LazyCollection(LazyCollectionOption.TRUE)
    @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
    private Collection<String> identifiers;
    // getters/setters
}

在标识符数组内部,我保存了标识相关性的值。 我想加快查询事件相关性的查询,我的第一个想法是从相关性identifiers创建唯一的ID。

我有一个知识库,该数据库从给定事件中知道某些属性是相关标识符。

有小费吗?

一种可能的解决方案是将您的值转换为字符串,并使用某种保留的定界符将它们连接起来,以确保保留顺序。 字符串将成为您的唯一ID。

例如,值1,“ Bob”,7383.234,“ {asdf}”和2013-01-08将具有以下唯一ID:

"1|Bob|7383.234|{asdf}|2013-01-08"

这是一种记忆技术。

例如两个食物事件:

Event11: {type: food, values: [{group: vegetable, name: brocollis, quantity: 2, weight: 0.1]}
Event12: {type: food, values: [{group: vegetable, name: brocollis, quantity: 3, weight: 0.27]}

可能是这两个事件都是针对肉鸡,但数量和重量不是ID的一部分吗? 我认为这是由您的知识数据库回答的,该数据库知道从给定事件中,某些属性是相关标识符

设置ID属性后,假设{type,group,name},就可以对其进行排序并从中构建ID。 例如“ {group:vegetable,name:brocolis,type:food}” = ID为字符串,属性按属性名称排序。

顺便说一句,您提到您的域未关闭,但是您拥有知识数据库这一事实应意味着这将允许的类型限制为仅已知集合。 因此,至少对于类型,如果您想使ID短一点,则应该能够找到一些表示类型的数值。

唯一的方法是创建字符串字典。 对于每个唯一的字符串,您将在此字典中获得唯一的ID 但是这种方法会导致性能下降和内存使用增加。

编辑1 :顺便说一句,一种可能的想法是使用本机String的对象ID。 我的意思是,在Java中,所有字符串都是本地缓存的。 因此,您可以尝试使用其本机哈希值,这些哈希值与其对象的内存地址相关联。 类似于使用System.identityHashCode()

编辑2:在我以前的声明中,我对字符串的缓存不太准确。 您可以通过任何方式手动创建此类缓存(使用HashMap ),然后在System.identityHashCode()使用缓存的值对象。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM