0

PHP ソース コード関数 uniqid() には、次の C コードがあります: (短縮するためにいくつかの型を削除しました)

//...
struct timeval tv;
gettimeofday(&tv, NULL);
int sec  = (int) tv.tv_sec;
int usec = (int) (tv.tv_usec % 0x100000);

// The max value usec can have is 0xF423F,
// so we use only five hex digits for usecs.
printf("%08x%05x", sec, usec);
//...

批判はさておき、彼らは 64 ビットのタイムスタンプを生成しようとしています。

0xF423FはおそらくCLOCKS_PER_SEC - 1 (CLOCKS_PER_SEC は 10 進数の 1000000) です。

しかし、この0x100000はどこから来て、ビットごとの代わりにモジュラスを使用する理由は何ですか?

4

1 に答える 1

2

彼女または彼は、一意の ID を次のように書くことができます。printf("%08x%08x", sec, usec)

sample output:
55189926000eb16f
5518997900051219
5518997a0005171b

位置 8 から 10 のゼロは一貫しており、エントロピーを追加しないため、彼はそれらのゼロを取り除きたいと考えています。新しい UID は、同じエントロピーで 3 バイト短くなります。彼は単に使用することができましたprintf("%08x%05x", sec, usec);

sample output:
55189926eb16f
5518997951219
5518997a5171b

しかし、これは、usec が 0x100000 未満であることが保証されているという前提に基づいています。それ以外の場合、UID は最大 16 バイトの長さになります。% 0x100000保険が必要です。と同じ& 0xFFFFFです。技術的には、保険は である必要がありますが% 1000000 (decimal)、実際には問題ではありません。それでも同じエントロピーです。

または、16 バイトのバージョンを使用することもできます。最近では、3 バイトを節約することは問題にならないからです。

于 2015-03-30T01:05:48.227 に答える