问题标签 [id-generation]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
5 回答
1166 浏览

javascript - 从 JavaScript 中已知的一组潜在 ID 创建唯一字符串 ID/键的快速方法

假设您想要一组 1 到 2 位的十六进制数字,即 256 个数字。只需使用一个小集合来解决问题,但它适用于任何大小的字符串。

因此,在这种情况下,您有一个潜在 N的或 256 个数字。您将为遇到的每条新数据记录“生成”一个新 ID。所以它开始并随机给你af, then 1d, then8a等。

直接简单的方法是简单地按顺序生成所有数字,然后将它们洗牌,然后从集合中弹出。当您只有 256 个数字时,这可以正常工作。但是,如果您有数百万或数十亿个数字,这是不切实际的,因为您可能有大量生成的 ID 长时间未使用。我想避免这种情况。

所以我的问题是创建这样的唯一键字符串的最快方法是什么,而不是预先生成所有这些字符串,也不需要按顺序递增 1 或诸如此类。也就是说,密钥应该是看似随机的。

我可以想象的一种方法是使用 trie 来存储已经使用/生成的值。然后,当您要获得一个新值时,您会生成一个随机值,然后检查 trie 以查看它是否已被使用。我不知道如何判断它的效率如何,但是一旦你开始用完 ID 并且下降到集合中的最后几个 ID,它的性能似乎会非常糟糕。您将生成许多已经生成的 ID,并为每个 ID 遍历 trie,因此会很慢。

我想知道是否有更有效的方法来执行此操作,而无需提前生成它们。此外,数据记录不会用于确定 ID,因为记录可能非常大且非常复杂。

也许有一种方法可以一次随机遍历(并生成)一个 trie,并以这种方式生成 ID,因为您最终位于 trie 中一个唯一的随机位置。我不知道,也许是类似的东西。

另外,我对散列并不复杂,所以我不知道是否有任何好的方法。

0 投票
2 回答
1171 浏览

java - org.hibernate.id.IdentifierGenerationException:必须在调用 save() 之前手动分配此类的 id:com.app.entites.LDetails

我尝试了很多次使用下面的代码在我的表中插入 id 值,但它总是抛出 org.hibernate.id.IdentifierGenerationException:必须在调用 save() 之前手动分配此类的 id:com.app.entites.LDetails

以下是实体类中的代码

我已经使用 IdentifierGenerator 实现了 id 生成器,如下所示

}

0 投票
1 回答
982 浏览

java - Spring JPA - 序列缓存给出了意想不到的行为。使用分配大小 = 1 是可以的

我的 Spring Boot 应用程序使用 2 个实体类。实体类 1 使用使用序列的技术密钥 id。实体包含其他实体的列表,因此是一对多的。Child 实体使用相同的序列。

使用 20 的序列分配(缓存)大小,我看到我得到 EntityExistsException:

javax.persistence.EntityExistsException:具有相同标识符值的不同对象已与会话关联:[nl.xyz.app1.entity.ChildFields #123456]

实体是:

当我使用分配序列 1 时,一切正常!为什么是这样?

等等。

0 投票
2 回答
1323 浏览

database - 为什么要将分片 ID 附加到生成的 ID 上?

我正在阅读: https ://instagram-engineering.com/sharding-ids-at-instagram-1cf5a71e5a5c

在最后一节“解决方案”中,他们根据数据库的自动增量功能 + 自纪元以来的毫秒数 + 分片 ID 生成全局唯一 ID。

为什么我们需要给它附加分片 ID?

具体来说,它说

接下来,我们为尝试插入的特定数据获取分片 ID。假设我们按用户 ID 进行分片,并且有 2000 个逻辑分片;如果我们的用户 ID 是 31341,那么分片 ID 是 31341 % 2000 -> 1341。我们用这个值填充接下来的 13 位

这没有任何意义:如果您已经根据分片数量(31341 % 2000)修改用户 ID,这意味着 1)您已经拥有用户 ID!2) 你已经通过 mod 功能知道了它所属的分片!

我在这里有什么误解?

0 投票
2 回答
1253 浏览

sql-server - 模式验证:使用 Hibernate 序列生成器策略时缺少表 [SEQUENCE_NAME]

我在休眠 id 生成和 ms sql 服务器方面遇到了一些问题。

GenerationType.SEQUENCE在我的应用程序中使用休眠生成 ID。

作为 DB,我使用 microsoft sql server 2017。

我通过 Liquibase 创建序列:

启动 Spring Boot 应用程序时出现错误:

当我手动查询序列时,可以找到:

我有点困惑,它说“丢失的桌子”。使用 oracle 可以正常工作。mssql 不支持通过序列生成 id。

我的配置:

我使用这个泊坞窗图像:mcr.microsoft.com/mssql/server:2017-CU12-ubuntu

0 投票
0 回答
737 浏览

go - 使用 etcd 集群生成序列号

我正在探索 etcd 来实现分布式环境的序列号生成器。我的要求是生成不重复的序列号,用于同一应用程序的多个实例的每个请求中。并且可以有n个这样的应用程序的要求。我使用golang 客户端包中提供的 STM 和互斥锁以多种方式为此做了 POC

在本地机器设置中使用单节点 etcd 服务器(将是 RAFT 在生产中工作的至少 3 个节点集群),我编写了一个简单的程序来在 500 个 goroutine 中生成 ids(数字)。每个例程每个都有 10 个 id,因此总共有 5000 个 id。使用时间统计,重试尝试的 STM 比互斥锁执行得更好。除了这些方法之外,还有没有更好的选择来实现序列号生成?首先可以将 etcd 用于此目的吗?

PS:我附上代码示例仅供参考。我不希望它被审查。我关心的是使用 etcd 生成序列号的正确方法

0 投票
2 回答
4088 浏览

hibernate - org.hibernate.MappingException:序列的增量大小在实体映射中设置为 [10] 而 ... size 为 [1]

我们在更新到 Spring Boot 2.2 和相关的 Hibernate 5.4.x 时遇到了问题。

我们确实有以下序列生成器

随着对 SB 2.2 / HB 5.4 的更新,我们得到以下初始化错误

DB序列增量大小为1:

但是,据我了解,hilo 算法的(软)增量大小与数据库的(硬)增量大小无关。

这是HB中的错误还是我们可以以某种方式规避这个问题?

WRT 对 Jens 的问题:

  • 序列由 Liquibase 生成:

    /li>
  • 它发生在应用程序上下文设置/Bean 初始化期间:

    /li>
  • 禁用验证不会改变任何东西

  • 向 GH 添加了一个示例项目:https ://github.com/ascheman/hibernate-so-59305427

  • 堆栈跟踪:

    /li>
0 投票
1 回答
392 浏览

jpa - 如何手动设置 @GeneratedValue 的值

使用 Spring Data JPA 进行 Spring 启动。Postgres 数据库。

一般实体:

当我尝试使用指定id值创建条目时,结果我看到它被忽略并由@GeneratedValue.

如何克服这一点?

0 投票
1 回答
476 浏览

oracle - 如何使用 JdbcTemplate(或纯 JDBC)从 Oracle 获取带有小写字符的列的生成密钥

如果我创建一个这样的表:

我可以使用如下方法插入一些数据并取回生成的 id:

template这是一个NamedParameterJdbcTemplate,但由于没有参数,它应该等效于对 . 的类似调用JdbcTemplate

但是,如果我使用一个稍微不同的表,其 id 的列名称为小写:

传递列名id失败:

使用(下面的完整调用堆栈)

传递引用的列名"id"也会失败:

使用(下面的完整调用堆栈)

那么:当 id 列是小写时,如何从 Oracle 数据库中获取生成的值?首选基于NamedParameterJdbcTemplate或 的解决方案JdbcTemplate,但我也采用基于普通 JDBC 的答案。

更新调用中未引用 id 时的完整调用堆栈

调用更新时引用 id 时的完整调用堆栈

0 投票
1 回答
116 浏览

oracle - 在 Oracle Golden Gate 上按序列生成 ID

在我的 Oracle 19c Golden Gate 集群上,不同地理位置的两个实例同时运行。(主动-主动)

在我的应用程序代码中,我需要生成 ID,为此我更喜欢使用 Oracle 序列(nextval 函数)。Oracle Golden Gate不保证在不同站点上生成不同的值。由于存在在不同站点上生成相同 nextval 的风险,因此我正在寻找替代方法。

现在我有两个我不喜欢的选项:

  • 每个站点都可以有自己不同的种子值并以 2 递增。
  • 每个站点都可以保留一个范围并在自己的范围内产生价值。

除了这些选项,您还有其他建议吗?