我有一个应用程序,它使用Event Message
上生成的数字eventNumber
作为消息id来生成Notification Message
。eventNumber
肯定是独一无二的,而且还在不断增加。
因此,对于每个genNum,我们生成一条通知消息。
eventNumber on EventMsg | Notification Msg ID
---------------------------------------------
23 | 23
31 | 31
37 | 37
我们在Notification message
中使用消息id来跟踪哪个Event message
生成了它。因此,假设我们收到一条ID为123
的通知消息。有了这个ID 123
,我们就可以说带有123
的事件消息生成了那个通知消息。
问题在于,在极少数情况下,一条事件消息可能需要生成两条通知消息。因为每个Notification Message
都必须是唯一的,所以这是一个问题。
假设我们有一个ID为456
的事件,它要求我们生成2条通知消息。这是一个问题,因为我们希望每个通知消息都有一个唯一的Id。这意味着我们不能使用456作为两个通知消息的消息ID。
有没有办法仍然使用事件消息ID 456
,为2条通知消息生成唯一的ID?这个结果ID应该仍然可以解码它来自ID为456的事件的事实。
所有id/类型为long的编号。
到目前为止,我的简单解决方案是对于每个事件ID,我乘以10
,然后递增第二个事件ID。所以456
变成了4560
。通知消息1将分别具有ID 4560
和4561
。有没有更好的方法来解决这个问题呢?感谢您抽出时间阅读此问题
发布于 2020-03-24 23:55:36
当我想要生成一个唯一的数字时,我使用这种方法,因为有很小的变化,使数字与其他生成的数字相同;
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。解码第一个消息编号很简单。这也适用于BigIntegers,但我从来没有使用过它们,也不知道如何使用它们。
您可以通过将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;
}
https://stackoverflow.com/questions/60834307
复制相似问题