0

かなり簡単な方法だと思っていた方法でタイムスタンプを生成したいのですが、数学が私を逃れています!

次の基準を満たす 2 つのタイムスタンプ (エポックからのミリ秒単位) を生成したいと思います。

  1. それらは等しいです。
  2. 互いに 10 秒以内に生成された場合、それらは等しくなります。
  3. それらは数分後に「期限切れ」になります-たとえば、最小5、最大10?. (つまり、将来の日付のタイムスタンプ)

ユースケースは次のようなものです:

  • クライアント A は、サーバー A に現在の時刻を要求します。応答を使用して、それ自体のクロック ドリフトを解決します。
  • クライアント A は、サーバー A の時刻に基づいて有効期限のタイムスタンプを生成し、サーバー B に送信します (暗号化されているため、読み取ることはできません)。
  • サーバー B は、サーバー A とサーバー B の同期が 10 秒未満であると仮定して、同一の有効期限を持つ同一のタイムスタンプを生成します。

例:

Time SvrA    Time SvrB    Client A    Server B

11:53.00     11:53.09     12:00.00    12:00.00
11:53.09     11:53.00     12:00.00    12:00.00
11:54.59     11:55.00     12:00.00    12:00.00
11:54.59     11:55.08     12:00.00    12:00.00 - could be 12:05 as long as they match
12:00.00     11:59.59     12:05.00    12:05.00 - could be 12:10 etc...

等....

理想的には、Longs だけで動作し、Java Calendars を回避できるものが欲しい

4

1 に答える 1

0

ミリ秒のタイムスタンプを使用して、それらの差の絶対値が 10 秒で、最も古いものが 10 分以内であるかどうかを確認してみませんか?

public static final long MAX_SKEW = 10 * 1000; // 10 seconds.
public static final long MAX_AGE = 10 * 60 * 1000; // 10 minutes.
public static boolean timestampsMatch(long t1, long t2) {
  if (Math.abs(t1 - t2) > MAX_SKEW) { return false; }
  final long oldest = Math.min(t1, t2);
  final long now = System.currentTimeMillis();
  if ((now - oldest) > MAX_AGE) { return false; }
  return true;
}
于 2013-02-07T00:20:43.963 に答える