【问题标题】:Get current time (milliseconds) without a call to a System method无需调用 System 方法即可获取当前时间(毫秒)
【发布时间】:2021-04-12 13:36:31
【问题描述】:

我正在尝试挑战自己;我的目标是创建和打印一个没有MathSystem 方法的随机数。

我已经有了一种不使用System.out.println() 打印到控制台的方法,但是我在寻找一种无需系统调用即可获得时间(System.currentTimeMillis()) 的方法时遇到了障碍。

我了解我需要将当前时间用作随机数生成的种子。

我不想使用任何数学或时间相关的导入

编辑:可能不应该问这个……这只是我的一个想法哈哈

【问题讨论】:

  • 不过,你似乎在问我们。
  • java.time.Instant.now().toEpochMilli()
  • 尝试挑战自己是件好事,但我不确定为自己设置在现实生活中永远不会遇到的不必要的限制是否真的有用。您的问题有点像在汽车论坛上询问如何在不使用现有桥梁的情况下驾车穿越峡谷。
  • 另请注意:我知道我需要将当前时间用作随机数生成的种子 ...确定你真的了解那部分?你看,系统时间可以从外部控制。使用系统时间是一个很好的起点,但不要相信这样做会给您带来真正的安全性。
  • 这就是这里的重点:小心你在哪些方面投入精力。 不使用使用系统调用来获取系统时间...是一个非常无聊的练习。您要么使用其他一些库调用(最终可能只是在封面下调用相同的方法)......或者您需要编写 JNI 调用来从 java.util.Date 调用一些底层的本机 OS 函数。从学习的角度来看,这并不太有趣。学习如何做适当的安全,以及从哪里获得所需的熵......非常不同的故事。

标签: java time


【解决方案1】:

使用java.time.Instant:

long now = Instant.now().toEpochMillis();

这当然只有在“系统调用”是指“不调用 System 类的方法”而不是“没有 Java 系统的方法”时才有效。

【讨论】:

  • 我的目标是不使用数学或与时间相关的导入,我已经对我的问题进行了更改。
  • 不错的尝试,但这违背了挑战的目的!
  • @JonahM 在 Stack Overflow 上提问不是也违背了挑战的目的吗?
  • @JonahM Vanilla java 包含 System.您正在尝试查看使用任意约束可以实现什么。
  • 重申@Michael 的正确说法:没有java.lang.System(以及许多其他类)就没有“Java”。试图不使用它们来获得一些奇怪的“纯粹”概念是被误导的。就好像您尝试在没有java.lang.Objectjava.lang.String 的情况下使用java。
【解决方案2】:

嗯,你必须从某个地方得到你的种子。硬编码的随机常数可以吗?不,我想不是。否则你会被设置。

因此,您需要从程序之外的某个地方读取该种子。您可以从服务器、文件系统、用户输入中获取它,有很多选项,不一定是系统时钟。我曾经写过一个程序,它通过对最近数据库事务中的一些位进行混洗并对结果进行散列处理来生成随机数。我什至没有使用伪随机数生成器。但是你需要在你的程序之外进行一些调用。

【讨论】:

  • 我正在考虑做一个 HTTP 请求并只解析 Date 标头,但即使没有时间类也不容易工作......
  • HTTP 请求的日期标头就可以了。为什么不先获取标头的哈希码而不先对其进行解析呢?或者对于 long 种子分别散列每一半并将两个 int 值连接到 long。不能严格保证种子不会重复,但实际上不会。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-25
  • 2017-02-20
  • 2017-04-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多