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

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

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

ブログ    

推薦する

従来の AGV と比較した利点は何ですか? AMRロボット業界の状況は変化する

ロボット技術の知能化は、ロボット応用分野の継続的な拡大にプラスの影響を与えています。この傾向を受けて...

ネットワーク人工知能とは何ですか?

今日、ますます多くの企業が人工知能 (AI) とネットワークの相乗効果を活用しています。ユーザーデバ...

エッジコンピューティング時代の到来は AI にどのような影響を与えるのでしょうか?

[[270834]]近年、人工知能はテクノロジー界で注目されている分野です。中国では、Megvii...

世界初、常温量子コンピュータが実用化!絶対零度の温度は必要ありません。メインコアには実際に「ダイヤモンドがセットされています」

量子コンピューティングは、おそらく現在最もエキサイティングな(そして話題になっている)研究分野の 1...

面白いですね!プログラマーが AI を使って双子の息子を認識するんです! 「この Raspberry Pi の顔認識システムは私のものほど正確ではありません」

2021年までに、学習アルゴリズムと人工知能の研究を通じて、機械は多くの面で人間よりも優れていると...

AIの奇妙な使い方:マクドナルドはゴミ箱の監視にAIを活用

この記事は公開アカウント「Reading Core Technique」(ID: AI_Discov...

インターネットで話題! 23歳の中国人医師が22歳の歴史的弱点を治す、ネットユーザー「この話はいいね」

最近、別の若い中国人男性が、22年間存在していたバグを修正したことでインターネット上で人気を博した。...

ニューラルネットワークの父ヒントン氏は、34年前の画期的な業績を再検証し、脳内のAI手法の「存在」を模索している。

これまで耳にした人工知能の進歩のほぼすべては、30 年前に発表された、多層ニューラル ネットワークを...

すべてがUniSimに: 統合自動運転シミュレーションプラットフォーム

最近、トロント大学、MIT、Waabi AIの研究者らがCVPR 2023の論文で新しい自動運転シミ...

ChatGPT がまたトラブルに巻き込まれました! OpenAI が初の AI 名誉毀損訴訟に直面!

51CTOウェブサイトコンテンツ調査に参加するにはクリックしてください著者: 徐潔成ChatGPT...

5GとAI: 現在と未来の補完的なテクノロジー

人工知能と5G、そしてそれらがもたらす変革の可能性は、テクノロジーの世界で大きな注目を集めています。...

生成 AI に新しい設計アプローチが必要なのはなぜですか?

生成AIについて議論するインタビューでは、懸念から驚きまでさまざまな反応がありました。そしてベンチャ...

AI軍拡競争により、将来のAIハードウェアアーキテクチャの開発に3つの主要な方向性が生まれました。

この記事はLeiphone.comから転載したものです。転載する場合は、Leiphone.com公式...

...

AIに勝てずイ・セドルが引退を発表

[[284089]] AI囲碁プログラム「アルファ碁」を破った唯一の人間である韓国の九段、イ・セドル...