2

我需要找到一种方法,一组值将始终生成相同的 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的相关性也由其name和给出group。即,相关标识符的数量是可变的。

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

@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
}

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

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

有小费吗?

4

3 回答 3

4

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

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

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

这是一种记忆技术。

于 2013-01-08T18:37:48.953 回答
1

例如两个食物事件:

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]}

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

一旦你为 ID 设置了属性,比如说 {type, group, name},你可以对它们进行排序并从中构建 ID。例如“{group:vegetable,name:broccolis,type:food}” = ID 为字符串,属性按属性名排序。

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

于 2013-01-08T19:36:30.657 回答
0

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

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

编辑 2:在我之前的陈述中,我对字符串的缓存不太准确。无论如何,您都可以手动(使用HashMap)创建这样的缓存,然后在System.identityHashCode()

于 2013-01-08T18:48:14.717 回答