首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >什么是Hi/Lo算法?

什么是Hi/Lo算法?
EN

Stack Overflow用户
提问于 2008-11-11 20:53:01
回答 5查看 100.6K关注 0票数 488

什么是Hi/Lo算法?

我在NHibernate文档中找到了这一点(这是一种生成唯一键的方法,第5.1.4.2节),但是我还没有找到一个很好的解释它是如何工作的。

我知道Nhibernate可以处理它,我不需要知道它的内部,但我只是好奇。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2008-11-11 20:57:35

基本思想是你有两个数字来组成一个主键-一个“高”数字和一个“低”数字。客户端基本上可以递增“高”序列,知道它可以安全地从具有各种“低”值的前一个“高”值的整个范围生成密钥。

例如,假设您有一个当前值为35的“高”序列,而“低”数字在0-1023范围内。然后客户端可以将序列递增到36 (以便其他客户端能够在使用35的同时生成密钥),并且知道密钥35/0、35/1、35/2、35/3……35/1023都是可用的。

能够在客户端设置主键非常有用(特别是在ORM中),而不是插入没有主键的值,然后将它们取回客户端。抛开其他事情不谈,这意味着您可以轻松地建立父/子关系,并在执行任何插入之前将所有键都放在适当的位置,这使得批处理它们变得更简单。

票数 575
EN

Stack Overflow用户

发布于 2008-11-11 22:08:44

除了Jon的回答之外:

它用于能够在断开连接的情况下工作。然后,客户端可以向服务器请求hi号,并创建增加lo号本身的对象。在lo范围用完之前,它不需要联系服务器。

票数 166
EN

Stack Overflow用户

发布于 2014-06-23 22:27:11

hi/lo算法将序列结构域划分为hi组。同步分配hi值。每个hi组都有最大数量的lo条目,可以脱机分配这些条目,而不必担心并发的重复条目。

  1. hi内标识由数据库分配,并保证两个并发调用可以看到唯一的连续值

  1. 检索到hi令牌后,我们只需要incrementSize ( lo条目的数量)

  1. 标识符范围由以下公式给出:

[(hi -1) * incrementSize) + 1,(hi * incrementSize) + 1)

而“lo”值将在以下范围内:

[0,incrementSize]

从起始值开始应用:

[(hi -1) * incrementSize) + 1)

  1. 当使用所有lo值时,将获取新的hi值,循环将继续

这个视觉演示也很容易理解:

虽然hi/lo优化器可以很好地优化标识符生成,但在不了解我们的标识符策略的情况下,它不能很好地处理其他向我们的数据库插入行的系统。

Hibernate提供了pooled-lo优化器,它提供了hi/lo生成器策略的优点,同时还提供了与其他不知道该序列分配策略的第三方客户端的互操作性。

与传统的hi/lo标识符策略相比,pooled-lo优化器既高效又可与其他系统互操作,是一个更好的候选者。

票数 41
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/282099

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档