当前位置: 首页 > 知识库问答 >
问题:

从值集合生成唯一id

仲孙毅
2023-03-14

我想了解一下如何从java对象集合中生成唯一的id(字符串/数字等),这些对象可以是各种数据类型,如String、BigDecimal、org。乔达。时间本地日期或组织。乔达。时间LocalDateTime或任何自定义java对象。

生成的id应该基于java对象中的值,以便为具有相同值的两个集合生成相同的id。类似于sql group by子句的内容。我想从group by(col1、col2、col3)生成一个唯一的id,其中col1、col2和col3可以是任何数据类型。

共有3个答案

翁阳曜
2023-03-14

您可以尝试基于hashcode的方法

public static UUID id(List<?> list) {
    BigInteger prime = BigInteger.valueOf(31);
    BigInteger value = BigInteger.valueOf(list.size());
    for (Object element : list) {
        value = value.multiply(prime).add(BigInteger.valueOf(element.hashCode()));
        value = value.multiply(prime).add(BigInteger.valueOf(element.getClass().hashCode()));
    }
    return UUID.nameUUIDFromBytes(value.toByteArray());
}

尽管这并不能保证100%的唯一性。

景宏富
2023-03-14

您不能为任何对象执行此操作,因为例如java.lang.对象没有值。对于那些可以通过值识别的对象,有一个解决方案,但不简单:

创建

MessageDigest md = MessageDigest.getInstance("MD5");

迭代要在其上创建ID的对象中的所有字段,将其转换为字节(在最坏的情况下是字段“”)。getBytes())并用这些字节更新摘要

md.update(fieldBytes);
md.update(new int[0]);   we need separator to be safe

最后得到你的ID作为Bigintger

  BigInteger id = new BigInteger(1, md.digest());

还可以将其转换为十六进制字符串

String hex = String.format("%032X", id)

它实际上是独一无二的。MD5是16字节。或者,您可以使用SHA-1,它更强大,是20个字节。

尉迟京
2023-03-14

要在类型不变的情况下生成唯一键,可以使用

String id = Arrays.toString(col1, col2, col3);

如果需要它们是唯一的,即使是混合和匹配的类型,也可以使用序列化来生成二进制格式或

StringBuilder idsb = new StringBuilder();
for(Object o: arrayOfObjects) 
    idsb.append(o.getClass()).append(':').append(o).append(',');
String id = idsb.toString();

如果你有

Object col1 = "2012-04-19 12:13:46", col2 = "2012-05-02", col3 = "Andy";
String key = col1+"~"+col2+"~"+col3;
 类似资料:
  • 问题内容: 我需要一个可以根据键查找值的集合,反之亦然。每个值都有一个键,每个键都有一个值。有没有可以立即使用的数据结构呢? 问题答案: 该BIMAP从谷歌番石榴看起来会适合你。 双向映射(或“双向映射”)是一种保留其值以及其键的唯一性的映射。此约束使bimap可以支持“反向视图”,这是另一个bimap,它包含与此bimap相同的条目,但具有相反的键和值。 或来自Apache Commons Co

  • 我的数组包含从0到整数的随机唯一数。最大值。 如何生成唯一的id/签名(int)来唯一地标识每个数组,而不是搜索每个数组并检查每个数字。 例如 每个数组可以有不同的长度,但数字在数组中不重复,可以在其他数组中重复。每个数组的唯一id的目的是通过id来识别它,以便快速进行搜索。数组包含组件的id,数组的唯一签名/id将标识其中包含的组件。 此外,无论数组中的值的顺序如何,生成的id应该是相同的。像{

  • 问题 你想随机生成一个唯一的标识符。 解决方案 可以根据一个随机数值生成一个 Base 36 编码的字符串。 uniqueId = (length=8) -> id = "" id += Math.random().toString(36).substr(2) while id.length < length id.substr 0, length uniqueId() # =

  • 问题内容: 我有一个带有String的对象,该对象具有唯一的id。(例如“ ocx7gf”或“ 67hfs8”),我需要为其提供int hascode()的实现,该实现显然是唯一的。 如何以最简单/最快的方式将字符串转换为唯一的int? 10倍 编辑-确定。我已经知道String.hashcode是可能的。但是不建议在任何地方使用。实际上’,如果不建议使用其他任何方法- 如果我的对象在集合中并且需

  • 我有一个data.table,我需要生成另一个data.table,它只列出每列的唯一值。一个例子: 从 到 实现这一点最有效的方法是什么?

  • 我有一个本体,是使用Protegé4.3.0创建的,我将使用OWL-API,以便向文件OWL添加一些对象。我使用以下指令来创建新的: 变量是; 是所加载本体的基IRI;为了获取本体的基IRI,我使用了以下指令:. 因此,新的被添加到加载的本体论中,然后使用以下指令将本体论保存到OWL文件中。 变量是从文件的基名(即不带扩展名的文件名)生成的。如果文件的基名在名称中有一个或多个空格,则本体被保存而没