在以下情况:

1数据库 4网服务器

如何做的网络服务器产生的独特的身份证数据库,使他们是独特的?是的,它是能够使用自动增加,但这个太轻松爬/猜到了。所以自动增加是目前不是一个选项。

有帮助吗?

解决方案

使用一个UUID( http://www.ietf.org/rfc/rfc4122.txt )。冲突是不太可能的,并且可能会发生当它们与通过再生一个新的UUID来处理,或者它们可以通过连接一个唯一的id为每个服务器(如MAC地址)来防止: -

StringBuilder sb = new StringBuilder(UUID.randomUUID());
InetAddress address = InetAddress.getLocalHost();
String uid = sb.append(NetworkInterface.getByInetAddress(address).getHardwareAddress());

其他提示

可以使用一个UUID:

import java.util.UUID;        

UUID uuid = UUID.randomUUID();
System.out.println(uuid.toString());

如果你实在担心冲突,您可以预先生成的密钥和他们在一个数据库表具有唯一索引存储。然后具有停机期间填充表,并且去除周期性工作/档案中使用了一段时间的键一次。

什么DB系统是您使用?该应用是否知道哪个服务器发出请求?你让DB决定的关键,还是在代码中设置呢?

它可以像使用自动递增的前缀或第二字段,其指示所请求的密钥的服务器一样简单。

我不知道为什么一个自动增加或序列是不可接受的。你想要一个内部ID不是"猜测"?什么,就像这是一个帐户号码,你不希望有人能够猜测一个有效的帐户号码的?

好吧,好吧,除了应付已经提到的,两个明显的可能性。

  1. 使用的序列,然后产生随机数量,并创建的帐户数目从两者的结合使用算法,这样两个不同的序列号无法得到相同的最终编号。例如,一个简单的算法是:采取的下一个序列号,乘以1 2 3 4 5 6 7 8a,产生随机数量,从0到12345678-1,并添加两个在一起。

  2. 有一个表格上的数据库有一个记录,它拥有最后的分配数量。每次你需要一个新的数量,锁定这个记录,使用先前的价值产生下一个价值,并更新该记录。只要的数量一直增加,你保证不重复。

如果你有一些方案,该方案使用的标识符作为服务器的标识符的一部分,我会鼓励你没有意识只是一个数字存储的配置文件的地方。我正在系统现在在哪里有人已经明亮的想法,得到各个服务器的"服务器的标识",是建立在记录证件和服务器标识是一个小型的整型手动分配。它不是太难在生产其中只有3个服务器。但在开发和测试新的服务器都来上下所有的时间和测试配置文件都在不断被扔周围,这是一个痛苦的管理。我会避免使用的一个服务器标识期,但是如果你想使用一个,使其自动分配通过一些中央服务器、或获得从IP,或者东西的安全。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top