我想了解一下如何从java对象集合中生成唯一的id(字符串/数字等),这些对象可以是各种数据类型,如String、BigDecimal、org。乔达。时间本地日期或组织。乔达。时间LocalDateTime或任何自定义java对象。
生成的id应该基于java对象中的值,以便为具有相同值的两个集合生成相同的id。类似于sql group by子句的内容。我想从group by(col1、col2、col3)生成一个唯一的id,其中col1、col2和col3可以是任何数据类型。
您可以尝试基于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%的唯一性。
您不能为任何对象执行此操作,因为例如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个字节。
要在类型不变的情况下生成唯一键,可以使用
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文件中。 变量是从文件的基名(即不带扩展名的文件名)生成的。如果文件的基名在名称中有一个或多个空格,则本体被保存而没