【问题标题】:Using a long number to generate 2 unique long numbers使用长数生成 2 个唯一长数
【发布时间】:2020-03-24 15:37:16
【问题描述】:

我有一个应用程序,它使用Event Message 上生成的号码eventNumber 作为消息ID 来生成Notification MessageeventNumber 保证是唯一的并且不断增加。

所以对于每个 genNum,我们都会生成一条通知消息。

eventNumber on EventMsg | Notification Msg ID
---------------------------------------------
                23      |   23
                31      |   31
                37      |   37

我们使用Notification message 中的消息ID 来跟踪是哪个Event message 产生的。假设我们有一个 ID 为123 的通知消息。使用该 ID 123,我们可以说带有 123 的事件消息产生了该通知消息。

问题在于,事件消息可能需要生成 2 条通知消息的情况很少见。由于每个Notification Message 都必须是唯一的,这是一个问题。

假设我们有一个 ID 为 456 的事件,它要求我们生成 2 条通知消息。这是一个问题,因为我们希望每条通知消息都有一个唯一的 Id。这意味着我们不能使用 456 作为两条通知消息的消息 ID。

有没有办法仍然使用事件消息 ID 456 为 2 条通知消息生成唯一 ID?这个生成的 ID 应该仍然可以解码它来自 ID 为 456 的事件这一事实。

所有长类型的id/数字。

到目前为止,我的简单解决方案是针对每个事件 ID,乘以 10,然后增加第二个。所以 456 变为 4560。通知消息 1 的 ID 分别为 45604561。有没有更好的方法来解决这个问题?感谢您抽出宝贵时间阅读此问题

【问题讨论】:

  • 你的方式有什么问题?对我来说似乎很好。
  • @Oleg 我想验证我的实现(逻辑)并看看是否有更好的方法。
  • (A) 当您的现有消息 ID 为 4560 时,当事件 ID 最终上升到 4560 时,您的系统会感到困惑吗? (B) 我建议你学习 128 位 UUID,而不是把精力放在自己的聪明方法上。
  • @BasilBourque 每个通知都有一个名称字段。所以它只需要在名称之间是唯一的。

标签: java bit-manipulation unique long-integer


【解决方案1】:

当我想制作一个唯一的数字时,我使用了这种方法,因为变化很小,与其他生成的数字相同;

long number;
public long unique(int number) {

this.number = number * number;
for(int i = 2; i < number; i++) {
if(this.number % i == 0) {
this.number = this.number / i;
break;
} 
}
return this.number;
}

不适用于素数,但可以!

示例第一条消息 id 8。此方法将生成第二个 id,它将是 32。解码第一条消息编号很简单。这也适用于 BigInteger,但我从不使用它们,也不知道如何使用它们。

您可以通过将public long unique(int number) 更改为public BigInteger unique(long number) 并将long number; 更改为 BigInteger number;

我为你制作了解码它的方法。请注意,它仅在某些时候有效!

double Squareroot;
public double find(long number) {
for(long i = 2; i <= number; i++) {
int testing = number * i;
Squareroot = Math.sqrt(test);
if(Squareroot == Math.floor(Squareroot) {
break;
}
}
return Squareroot;
}

【讨论】:

  • 质数问题可能是个问题。尽管如此,你的回答已经分享了一些关于我可以继续前进的方向。所以谢谢你
  • 我更新了解码答案。这是我的第一个想法,我如何才能解码它并且只在某些时候起作用。
  • 质数在起作用,但它们不是除数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-22
  • 2011-02-17
  • 1970-01-01
  • 2022-01-26
相关资源
最近更新 更多