什么是Hi / Lo算法?

什么是Hi / Lo算法?

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

我知道Nhibernate处理它,我不需要知道里面,但我只是好奇。


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

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

对于能够在客户端设置主键非常有用(特别是对于ORM),而不是在没有主键的情况下插入值,然后将它们提取回客户端。 除了其他任何东西,这意味着你可以很容易地做出父母/孩子的关系,并且在你做任何插入之前都有钥匙到位,这使得它们更简单。


除了乔恩的回答:

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


比Hi-Lo分配器更好的是“线性组块”分配器。 这使用类似的基于表格的原则,但分配小的,方便大小的块并生成好的人性化价值观。

create table KEY_ALLOC (
    SEQ varchar(32) not null,
    NEXT bigint not null,
    primary key (SEQ)
);

要分配下一个,比如20个键(然后将其作为范围保存在服务器中并根据需要使用):

select NEXT from KEY_ALLOC where SEQ=?;
update KEY_ALLOC set NEXT=(old value+20) where SEQ=? and NEXT=(old value);

提供您可以提交此事务(使用重试来处理争用),您已分配了20个密钥,并可根据需要分配它们。

这个方案的块大小只有20个,比Oracle序列分配速度快10倍,并且在所有数据库中都可以100%移植。 分配表现等同于hi-lo。

与Ambler的想法不同,它将键空间视为连续的线性数字线。

这避免了组合键的推动力(这从来不是一个好主意),并且避免了在服务器重新启动时浪费整个字。 它会产生“友好”的人类关键值。

Ambler先生的想法,相比之下,分配高16位或32位,并产生大的人类不友好的键值作为高字增量。

分配的键的比较:

Linear_Chunk       Hi_Lo
100                65536
101                65537
102                65538
.. server restart
120                131072
121                131073
122                131073
.. server restart
140                196608

实际上,我在90年代与Ambler先生通信以向他提出这一改进方案,但他太过坚持和顽固地承认使用线性数字线的优点和简单明了。

在设计方面,他的解决方案在数字线(复合键,大型hi_word产品)上比Linear_Chunk更复杂,但却没有比较优势。 他的设计因此在数学上被证明是不足的。

链接地址: http://www.djcxy.com/p/20307.html

上一篇: What's the Hi/Lo algorithm?

下一篇: Adding expire headers in htaccess