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

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

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

ブログ    
ブログ    
ブログ    
ブログ    

推薦する

データ分析技術:エッジ人工知能の応用

私たちが SF の世界に引き込まれると、人工知能と機械学習 (AI/ML) の概念は、映画「マトリッ...

...

AI バイアス: なぜ起こるのか、そして企業はどのように修正できるのか

ビジネスや社会で AI の利用が広まるにつれ、企業は機械モデルに現れる人間の偏見に注意を払う必要があ...

...

150 ページの「幾何学的ディープラーニング」がオンラインになりました: 対称性と不変性を利用して機械学習の問題を解決する

過去 10 年間、データ サイエンスと機械学習の分野では驚異的な進歩が見られました。ディープラーニン...

海外AI界が騒然! Googleの黒人女性AI倫理研究者が「退職」し騒動を引き起こす

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

自動運転における車線逸脱警報システムの技術サポート

無人運転技術にはまだ改善の余地があるものの、ますます成熟しつつあることは認めざるを得ません。車線逸脱...

人工知能のインダストリー4.0指標8つ

インダストリー 4.0 における AI イニシアチブの主要な運用指標と主要業績評価指標 (KPI) ...

ヘルスケアにおける自然言語処理 (NLP) の 8 つの例

翻訳者 | 夏東偉校正 | 梁哲、孫淑娟医療においては、データは患者の健康記録、医師の指示、処方箋か...

JavaScript におけるいくつかの一般的なソートアルゴリズムの共有

説明する各ブラウザテストから取得されるデータは異なります。たとえば、Chrome を使用してテストす...

...

音声技術市場には発展のチャンスがあるが、落とし穴には注意が必要

[[257487]] [51CTO.com クイック翻訳] 音声アシスタントの台頭により、マーケティ...

2020年末レビュー: AIの失敗トップ10

これは、Synced の年末総集編「AI の失敗」の第 4 弾です。私たちの目標は、AI 研究を非難...

未来の超人工知能はどれほど恐ろしいものになるのでしょうか?この記事を読んだら黙ってしまうかもしれません!

[[222688]]未来学者のケビン・ケリーはかつてこう言った。「人工知能は今後20年間で人類社会を...