android 應用程式,它需要為不同的用例生成一個隨機的 int 密鑰。它有一個隨機整數的函式,在大多數情況下都很好,但如果它被頻繁呼叫,它可能會回傳相同的數字。
int nextRandomId() {
return (int) SystemClock.uptimeMillis();
}
構建通知操作按鈕的情況之一,將有多個action button每個都有自己的 pendingIntent 和來自 nextRandomId() 的 requestid。
Intent broadcastIntent_one = Intent(this, NotificationReceiver.class);
broadcastIntent_one.putExtra("action", ACTION_ONE); //ACTION_TWO, ACTION_THREE
broadcastIntent_one.putExtra(EXTRA_NOTIFICATION_ID, notificationId)
// adding action for broadcast
PendingIntent broadcastPendingIntent_one =
PendingIntent.getBroadcast(application, nextRandomId(), broadcastIntent_one, PendingIntent.FLAG_UPDATE_CURRENT);
... ...
builder.addAction(null, "action one", broadcastPendingIntent_one);
builder.addAction(null, "action two", broadcastPendingIntent_two);
builder.addAction(null, "action three", broadcastPendingIntent_three);
在構建三個操作按鈕的情況下,日志顯示一些亂數是相同的:
16:00:55.003 nextRandomId(): 400267105
16:00:55.003 nextRandomId(): 400267106
16:00:55.003 nextRandomId(): 400267106
所以在NotificationReceiver最后兩個動作按鈕中都有ACTION_THREE額外的。
生成不重復的數字的更好方法是什么(無沖突,高效)?
uj5u.com熱心網友回復:
如果您不能有重復項,那么除了保存您已經生成的所有數字并進行檢查之外,任何亂數生成器都無能為力。
您可以生成越來越大的亂數以減少重復的概率——這就是 egUUID所做的,將其減少到極不可能。
使用RandomorSecureRandom可能必須足夠好,可能結合顯式測驗來查看您是否已經生成了給定值。
也就是說,如果您只需要生成在此 JVM 上沒有任何重復項的 ID,則解決方案非常簡單:
static final AtomicInteger counter = new AtomicInteger();
public static int getNewId() { return counter.getAndIncrement(); }
uj5u.com熱心網友回復:
它需要是隨機的,還是唯一的?
我建議不要使用,uptimeMillis()因為每次重新啟動系統時都會冒著沖突的風險。使用實際時間而不是正常運行時間來減少發生碰撞的機會。
或者,您可以使用java.util.UUID.randomUUID();. 理論上可以生成副本,但我不會指望它。
uj5u.com熱心網友回復:
對于您的應用程式,您可以考慮使用 SHA256 進行散列,然后取最后 N 個元素。如果您的輸入是一串固定的數字,那么您也可以期望在恒定時間內計算輸出。
請參閱: 如何在 Java 中使用 sha256 散列一些字串?
如果您想為物件分配隨機 ID,我建議您使用 GUID 庫。這將生成一個字串而不是一個數字,但您可以確定沒有兩個是相同的。
見:https : //kodejava.org/how-do-i-generate-uuid-guid-in-java/
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/318713.html
