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

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

[[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が報道

ブログ    
ブログ    
ブログ    

推薦する

毎日のアルゴリズム: スパイラルマトリックス

[[431971]]この記事はWeChatの公開アカウント「3分でフロントエンドを学ぶ」から転載した...

エッジウェアハウジング: 9 つの新しいウェアハウジング技術

倉庫業界はテクノロジー主導の革命の真っ只中にあり、企業はコストを削減し、業務を最適化し、サプライチェ...

AIレーシングドライバーが人間を破り自然の頂点に! 1,000台のPS4のトレーニング、トラックを支配するための極端な追い越し

近年、さまざまなゲームで高性能なAIが人間に勝利するというニュースが頻繁に登場しています。初期のチェ...

...

...

...

オープンソースのビデオ切り抜き技術が人気です!背景を変える方法は、それが真実か嘘かを判断するのが非常に難しい

グリーンスクリーンは、映画やテレビドラマで画像を切り取ったり背景を変えたりするのに強力なツールですが...

ウェブ開発のための機械学習フレームワークトップ 5

この記事では、TensorFlow や Caffe など、Web 開発用の主要な機械学習フレームワー...

再帰アルゴリズム: 不可解なスイッチ「ライトを引く」

[[411620]]タイトル出典:AcWing[1]。トピック「Pull the Light」とい...

AI を使って AI を修正しますか?これらの検出ツールを理解する

生成型AI作成ロボットの登場以来、各界はロボットを使って記事や学術論文を書くようになりました。この状...

ガートナー:2026年までに30%の企業がAI生成ディープフェイクのせいで信頼を失うと予測

ガートナーによると、2026年までに、人工知能(AI)によって生成された顔認証のディープフェイク攻撃...

香港最大のAI詐欺事件!ディープフェイクが「英国人CFO」の顔をすり替え、同社から2億香港ドルを直接詐取

ここ数日、古くからあるAIアプリケーション「AI変顔」が何度も話題となり、ホットな検索ワードに何度も...

Flask を使用して機械学習モデルを簡単にデプロイするにはどうすればよいですか?

[51CTO.com クイック翻訳] データ サイエンティスト/機械学習エンジニアが Scikit...

...

人工知能開発の新たな方向性

1. 大規模収集:あらゆる方向から情報を収集するデータ収集システムは、信号、センサー、アクチュエータ...