スノーフレークアルゴリズムを学ぶのに役立つ記事

スノーフレークアルゴリズムを学ぶのに役立つ記事

[[419666]]

序文

みなさんこんにちは、パンパンです!

これまでは rand と srand を使用して疑似乱数を生成していました。疑似乱数のシーケンスは固定されています。今日は、真の乱数を生成する方法を学びます。

エントロピープール

/dev/urandom は乱数値を生成するために使用できます。/dev/urandom は Linux のエントロピー プールです。いわゆるエントロピー プールは、現在のシステムにおける環境ノイズであり、システムのカオスの度合いを表します。環境ノイズは、メモリ使用量、ファイル使用量、さまざまな種類のプロセスの数など、いくつかの側面で構成されます。

/dev/urandom は乱数値を生成するために使用できます。/dev/urandom は Linux のエントロピー プールです。いわゆるエントロピー プールは、現在のシステムにおける環境ノイズであり、システムのカオスの度合いを表します。環境ノイズは、メモリ使用量、ファイル使用量、さまざまな種類のプロセスの数など、いくつかの側面で構成されます。

  1. #include <stdio.h>
  2. #include <fcntl.h>
  3.  
  4. intメイン()
  5. {
  6. 整数randNum = 0;
  7. 整数fd = 0;
  8.  
  9. ( int i=0;i<5;i++ )の場合
  10. {
  11. fd = open ( "/dev/urandom" 、 O_RDONLY);
  12. 読み取り(fd, ( char *)&randNum, sizeof( int ));
  13. 閉じる(fd);
  14. printf( "randNumは%dです\n" , randNum);
  15. }
  16.  
  17. 0を返します
  18. }

操作結果:

  1. mapan@mapan-仮想マシン:~/c++$ ./a.out   
  2. randNumは94961710です
  3. randNum-523780773です
  4. randNum1542169420です
  5. randNum-1632410867です

毎回印刷される 5 つの乱数は異なるため、実際のところ、そのランダム性はそれほど高くありません。スノーフレーク アルゴリズムによって生成される数字は非常にランダムであり、通常は分散システムで一意の ID を生成するために使用されます。

スノーフレークアルゴリズム

SnowFlake アルゴリズムによって生成される ID は、次の構造を持つ 64 ビットの整数です (各部分は「-」記号で区切られます)。

0 - 0000000000 00000000000 00000000000 0000000000 0 - 00000 - 00000 - 00000 - 0000000000

1 ビットの識別部分。Java では、long の最上位ビットが符号ビットであるため、正の数は 0、負の数は 1 です。通常、生成される ID は正の数であるため、0 になります。

41 ビットのタイムスタンプ部分はミリ秒単位です。通常、現在のタイムスタンプは保存されませんが、タイムスタンプの差 (現在の時刻 - 固定開始時刻) が保存されるため、生成された ID はより小さい値から開始できます。41 ビットのタイムスタンプは 69 年間使用できます (1L << 41) / (1000L 60 60 24 365) = 69 年。

10 ビットのノード部分では、Twitter は最初の 5 ビットをデータセンター識別子として使用し、最後の 5 ビットをマシン識別子として使用するため、1024 個のノードを展開できます。

12 ビットのシリアル番号部分は、同じミリ秒内に同じノードに対して 4096 個の ID を生成することをサポートします。

  1. /*
  2. スノーフレーク
  3.  
  4. ID生成戦略
  5. 41 ビットのミリ秒時間 + 10 ビットのマシン ID + 12 ビットのミリ秒内のシーケンス。
  6. 0 41 51 64 + -----------+------+------+ |時間 |pc |inc | +-----------+------+------+  
  7. 最初の 41 ビットはマイクロ秒単位のタイムスタンプです
  8. 次の 10 ビットは、事前に構成されたマシン ID です。
  9. 最後の 12 ビットは累積カウンターです。
  10. マシン ID (10 ビット) は、最大 1024 台のマシンが同時に ID を生成できることを示し、シーケンス番号 (12 ビット) は、マシンが 1 ミリ秒で最大 4096 個の ID を生成できることも示します。
  11. ビットシフトが使用されるため、64 ビットのオペレーティング システムが必要であることに注意してください。そうでない場合、生成される ID が正しくなくなる可能性があります。
  12. */
  13.  
  14. #include <stdio.h>
  15. #include <pthread.h>
  16. #include <unistd.h>
  17. #include <stdlib.h>
  18. #include <sched.h>
  19. #include <linux/unistd.h>
  20. #include <sys/syscall.h>
  21. #include <errno.h>
  22. #include <linux/types.h>
  23. #include<時間.h>
  24. #include <stdint.h>
  25. #include <sys/ time.h >
  26.  
  27. 構造体地球儀
  28. {
  29. グローバル_int :12;
  30. uint64_t 最後のスタンプ;
  31. 作業ID ;
  32. 整数シーケンスID;
  33. };
  34.  
  35. void set_workid( intワークID);
  36. pid_t gettid(void);
  37. uint64_t get_curr_ms();
  38. uint64_t wait_next_ms(uint64_t lastStamp);
  39. int atomic_incr( int id );
  40. uint64_t ユニークIDを取得します。
  1. #include "スノーフレーク.h"  
  2.  
  3. 構造体グローバルg_info;
  4.  
  5. #define sequenceMask (-1L ^ (-1L << 12L)) //L は long 型 4095 を示します
  6.  
  7. void set_workid( int作業ID)
  8. {
  9. g_info.workid = 作業ID;
  10. }
  11.  
  12. pid_t gettid( void ) //スレッドIDを取得する
  13. {
  14. システムコール(__NR_gettid)を返します
  15. }
  16.  
  17. uint64_t get_curr_ms() //ミリ秒を取得
  18. {
  19. 構造体timevaltime_now;
  20. gettimeofday(&time_now, NULL );
  21. uint64_t ms_time = time_now.tv_sec*1000+time_now.tv_usec/1000;
  22. ms_timeを返します
  23. }
  24.  
  25. uint64_t wait_next_ms(uint64_t 最後のスタンプ)
  26. {
  27. uint64_t カーソル = 0;
  28. する {
  29. cur は、 get_curr_ms を返します。
  30. } while (cur <= lastStamp);
  31. curを返します
  32. }
  33.  
  34. int atomic_incr( int id) // 累積
  35. {
  36. __sync_add_and_fetch(&id, 1);
  37. IDを返します
  38. }
  39.  
  40. uint64_t ユニークIDを取得する()
  41. {
  42. uint64_t ユニークID = 0;
  43. uint64_t nowtime = get_curr_ms(); //現在のミリ秒を取得
  44.  
  45. uniqueId = nowtime << 22; //タイムスタンプ部分を入力します
  46.  
  47. //0x3ff 1023、2進数は11 1111 1111に相当
  48. // 100 を 2 進数で表すと: 0000 0000 0000 0000 0000 0000 0110 0100
  49. //まずシフトを実行する
  50. uniqueId |= (g_info.workid & 0x3ff) << 12; //ノード部分を入力します
  51.  
  52. (現在時刻 < g_info.last_stamp) の場合
  53. {
  54. perror( "エラー" );
  55. 終了(-1);
  56. }
  57.  
  58. (現在時刻 == g_info.last_stamp) の場合
  59. {
  60. //4095 バイナリ 0000 1111 1111 1111 [long 型]
  61. g_info.seqid = atomic_incr(g_info.seqid) & シーケンスマスク;
  62. if (g_info.seqid == 0) //seqid=0 競合を防ぎ、時間を変更する
  63. {
  64. nowtime = wait_next_ms(g_info.last_stamp); //現在の時刻より大きい時刻を取得します 
  65. }
  66. }
  67. それ以外 
  68. {
  69. g_info.seqid = 0;
  70. }
  71. g_info.last_stamp = 現在時刻;
  72.  
  73. uniqueId |= g_info.seqid; //シリアル番号部分を入力します
  74. uniqueIdを返します
  75. }
  76.  
  77. intメイン()
  78. {
  79. ワークIDを100に設定します。
  80. 整数i;
  81. (i=0;i<10;i++)の場合
  82. {
  83. uint64_t ユニーク = get_unique_id();
  84. printf( "pthread_id:%u, id [%llu]\n" ,gettid(),unquie);
  85. }
  86.  
  87. 戻る;
  88. }

操作結果:

  1. mapan@mapan-仮想マシン:~/c++$ ./a.out   
  2. pthread_id:4970、ID [6595660141600063488]
  3. pthread_id:4970、ID [6595660141600063489]
  4. pthread_id:4970、ID [6595660141600063490]
  5. pthread_id:4970、ID [6595660141600063491]
  6. pthread_id:4970、ID [6595660141600063492]

結論

スノーフレーク アルゴリズムは多くの大企業で使用されており、エントロピー プールよりもランダム性が優れています。スノーフレーク アルゴリズムの考え方は、日常業務でも活用されています。複数のデータを 1 つの値に結合することは一般的なルーチンであり、習得する必要があります。

<<:  加速を解き放つ、8月の自動運転業界の動向の概要

>>:  非常に高価なイエス像はレオナルド・ダ・ヴィンチによって描かれたのでしょうか?アメリカ人夫婦が美術品の贋作を検出するAIプログラムを開発、CNNが報道

ブログ    
ブログ    

推薦する

RFID技術によるスマート製造

RFID 技術は、識別距離が長く、速度が速く、干渉に対する耐性が強く、複数のターゲットを同時に識別で...

アイソレーションフォレスト: ビッグデータにおける最高の異常検出アルゴリズム

Isolation Forest または「iForest」は、わずかなパラメータのみで外れ値を検出で...

生成AIは昨年人気が高まったが、米国のIT関連の仕事の数はわずか700件しか増加しなかった

1月8日のニュースによると、2023年には、生成型人工知能が企業や投資家の間で大きなブームを引き起こ...

人材獲得競争で大学に残ることを選んだAI研究者

[[265622]]ビッグデータダイジェスト制作著者: リン・アナン、周素雲AI 人材の需要が高まる...

AIから本当に恩恵を受けるのは誰でしょうか?

人工知能の可能性は計り知れないものの、この技術革命から誰が最も恩恵を受けるのかについては議論が続いて...

AI が「脳で画像を完成させる」ことを学習: ニューラル ネットワークが 0 から 1 までの画像を完成させる

1新しいインテリジェンス集出典: arXiv、Github張毅編纂[新しいインテリジェンスの紹介]自...

EUはAI法に加えて、GPT-4などの高機能モデルにも追加の規則と制約を追加する予定である。

今週末の12月10日、欧州連合はChatGPTを含む一般的な人工知能システムを対象とする世界初のAI...

AIによる朗読がオーディオブック市場に影響、声優の仕事が脅かされる

テクノロジーの進歩により、人工知能 (AI) が徐々に出版業界に参入し始めており、特にオーディオブッ...

ChatGPT「ピクチャートーク」が大変身しました!舞台裏で新型GPT-4Vモデルが公開

ChatGPTに音声・画像機能が加わりました! ChatGPT にログインすると、より直感的なインタ...

ジャック・マー氏がまたもや的を射た発言:「将来、住宅はタマネギのように安くなる」のは固定資産税ではなく人工知能のせい?

「家はタマネギのように安くなる」というのは、家を買う余裕のないすべての人にとっての将来のビジョンな...

ネイチャー誌の表紙:量子コンピューターの実用化はまだ2年先

この記事はAI新メディアQuantum Bit(公開アカウントID:QbitAI)より許可を得て転載...

...

...

浙江大学の「ホッキョクグマセーター」がサイエンス誌に掲載、ダウンジャケットの5倍の断熱効果

最近は寒波が次々と襲来し、ダウンジャケットは冬を過ごすための必需品となっています。浙江大学は、暖かい...