首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为多个源生成唯一ID

为多个源生成唯一ID
EN

Stack Overflow用户
提问于 2012-11-22 23:32:38
回答 2查看 92关注 0票数 1

考虑N个数据源,每个数据源都有一个事件流

代码语言:javascript
运行
复制
Event{
    long id;
    Object data;
}

一个流中的一些事件可能具有相同的id,因为事件可能跨越Updated、New等。因此,我们可以看到以下两个流:

代码语言:javascript
运行
复制
<1, 2, 3, 1, 5, 2>
<3, 3, 4, 5, 4>

现在我想将这些合并到一个流s.t中。每个订单id肯定是唯一的。

最简单的方法是使用字符串而不是long并附加source number,生成如下内容:

代码语言:javascript
运行
复制
<"1 - 1", "1 - 2", "1 - 3", "2-3", "2-3" ... >

是否有更多内存协同影响的方式/更好的方法?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-11-22 23:39:37

您的字符串解决方案很好,而且实际上相当常见。如果您对使其更紧凑感兴趣,那么您可能希望使用整数元组。

分布式系统中使用的另一种常见方法是使用范围分配:拥有一个中央(单例)服务器,该服务器分配每个客户端可以命名其ID的范围。这样的服务器可以例如将范围0-99分配给client1,将100-199分配给client2等。当客户端耗尽分配给它的范围时,它再次联系服务器以分配新的范围。

票数 1
EN

Stack Overflow用户

发布于 2012-11-23 00:26:40

根据流/事件编号的范围,您可以将这两个数字合并为一个int或long,将流编号放在顶部的许多位中,将事件编号放在底部的许多位中。例如:

代码语言:javascript
运行
复制
public static int getCombinedNo(int streamNo, int eventNo) {
    if (streamNo >= (1 << 16))
      throw new IllegalArgumentException("Stream no too big");
    if (eventNo >= (1 << 16))
      throw new IllegalArgumentException("Event no too big");
    return (streamNo << 16) | eventNo;
}

这将只对每个int使用4个字节,而对于您提到的这种类型的典型字符串,它的顺序是(比方说)50个左右的字节。(在这种情况下,它还假设流和事件编号都不会超过65535。)

但是:您的字符串解决方案也很好和清晰。内存是否真的如此紧张,以至于您不能为每个事件预留额外的50字节?

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

https://stackoverflow.com/questions/13515912

复制
相关文章

相似问题

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