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

时间:2013-01-08 18:27:12

标签: java database algorithm hash

我需要找到一种方法,即一组值将始终生成相同的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。

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

任何提示?

3 个答案:

答案 0 :(得分:3)

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

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

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

这是一种memoization技术。

答案 1 :(得分: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更短。

答案 2 :(得分:0)

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

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

编辑2:在我之前的陈述中,我对字符串的缓存并不十分准确。以任何方式你可以手动创建这样的缓存(使用HashMap),然后现在使用System.identityHashCode()中的缓存值对象