题
我需要生成一种独特的数为32位。我需要返回的数量作为Java int,这是需要由该接口。可以请你分享一些想法在这个?
数将用作MySQL PK和几个线程可能产生他们自己独特的身份证在相同的时间。(抱歉这是决定不使用MySQL增id)
我试图usb驱类,但它似乎是数据产生有更多的位于我可以使用。
我发现这个但不是肯定的如果它的工作:
// seems no way to get int
UUID id = UUID.randomUUID();
System.out.println(id);
// not working either?
java.rmi.server.UID uid = new java.rmi.server.UID();
System.out.println(uid.toString());
// the one i am using
SecureRandom prng = SecureRandom.getInstance("SHA1PRNG");
prng.setSeed(System.currentTimeMillis());
int ret = prng.nextInt();
System.out.println(ret);
解决方案
如何“唯一”你想要?总之,什么是冲突域?如果你正在处理数以千计的键,然后的 Random.nextInt()不正是要相对于你尝试什么与版本4的UUID(UUID V4生成128个随机比特)。
如果您需要碰撞的机会较少的东西,那么你需要有一个全球递增整数但仍然有很多照顾在这里采取如保持JVM启动之间的状态。对于你应该看看的AtomicIntegers 。
其他提示
的 SecureRandom
办法是好的,但不设定的种子。它将选择其自己的种子在(据推测)安全的方式。
你也可以使用痕只是放弃比特你不需要,例如
int key = (int)UUID.randomUUID().getLeastSignificantBits();
编辑:你也应该知道的 SecureRandom
是大大慢于 Random
.因为你没有做密码在这里,为什么不用 Random
?
我想你可以使用一个32位的散列函数。 细节在下面的教程给定 http://www.concentric.net/~ttwang/tech/inthash.htm一>
private static int hash(int key){
key = ~key + (key << 15); // key = (key << 15) - key - 1;
key = key ^ (key >>> 12);
key = key + (key << 2);
key = key ^ (key >>> 4);
key = key * 2057; // key = (key + (key << 3)) + (key << 11);
key = key ^ (key >>> 16);
return key;
}
不隶属于 StackOverflow