我有一个在eventNumber
上使用生成的数字Event Message
作为消息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
的事件消息产生了该通知消息。
问题是,在少数情况下,事件消息可能需要生成2条通知消息。由于每个Notification Message
必须是唯一的,所以这是一个问题。
假设我们有一个ID为456
的事件,该事件要求我们产生2条通知消息。这是一个问题,因为我们希望每个通知消息都具有唯一的ID。这意味着我们不能将456作为两条通知消息的消息ID。
是否仍可以使用事件消息ID 456
为2条通知消息生成唯一的ID?此生成的ID仍应可以解码来自ID为456的事件的事实。
所有ID /类型为long的数字。
到目前为止,我的幼稚解决方案是针对每个事件ID,我乘以10
,然后递增第二个。所以456
变为4560
。通知消息1将分别具有ID 4560
和4561
。有没有更好的方法来解决这个问题?感谢您抽出宝贵时间阅读此问题
[当我想创建一个唯一的数字时,我使用了此方法,因为变化很小,与其他生成的数字相同;
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;
}
无法正确使用质数,但可以使用!
示例第一个消息ID8。此方法将生成第二个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;
}