我有这段代码:
BigInteger bigInteger = new BigInteger(64, new Random());
Long longValue=-Math.abs(bigInteger.longValue());
int desiredLen=384;
Random random=new Random(longValue);
byte [] randomString=new byte[desiredLen];
for(int i=0;i<desiredLen;i++)
randomString[i]=(byte)(Math.abs(random.nextInt())&255);
现在有以下值:
简单地说,客户端发送包含前8个字节longValue的消息,其他内容是randomString加密的内容。
根据收到的longValue,在所有物理机和虚拟机以及所有Java版本上生成完全相同的数字的保证是什么?如果客户端是用C#等其他语言编写的呢?
答案 0 :(得分:1)
java.util.Random
的API文档指定了所使用的确切算法。
这不是铸铁保证,事情不会改变,不像方法的签名那么多,但是你在API文档中发布的任何实现细节几乎都是有约束力的。当然,甲骨文极不可能改变它。
你是否认为对你来说足够了取决于你。
我个人不会依赖它,不是因为它可能会改变,而是因为它引入了一种可能不会立即明显的依赖性。
决定还应取决于任务的重要性。如果它是一个业余爱好项目,它可能没关系,如果它是银行间的通信,我甚至根本不会考虑使用Random
,因为它不具有加密安全性。
至于与其他语言的互操作性,无法保证。