メインページ | アルファベット順一覧 | 構成 | ファイル一覧 | 構成メンバ | ファイルメンバ | 関連ページ

dkcSemiRealRandom.h

ほぼ真性乱数 [詳細]

#include "dkcGenericFileSystem.h"

dkcSemiRealRandom.hのインクルード依存関係図

このグラフは、どのファイルから直接、間接的にインクルードされているかを示しています。

ソースコードを見る。

構成

struct  dkc_SemiRealRandom

マクロ定義

#define dkcdSEMI_REAL_RANDOM_TRIAL_AND_ERROR_LIMIT   64
#define dkcdSEMI_REAL_RANDOM_BITS   64
#define dkcdSRR_TEMP_FILE_NAME   "secure_rand_temp.tmp\0"
 テンポラリファイルの名前
#define dkcdSRR_TEMP_FILE_NAME_W   L"secure_rand_temp.tmp\0"

型定義

typedef dkc_SemiRealRandom DKC_SEMI_REAL_RANDOM

関数

DKC_EXTERN DKC_SEMI_REAL_RANDOM
*WINAPI 
dkcAllocSemiRealRandom ()
DKC_EXTERN DKC_SEMI_REAL_RANDOM
*WINAPI 
dkcAllocSemiRealRandomFromGFS (DKC_GENERIC_FILESYSTEM *)
DKC_EXTERN int WINAPI dkcFreeSemiRealRandom (DKC_SEMI_REAL_RANDOM **)
DKC_EXTERN int WINAPI dkcSemiRealRandomInit (DKC_SEMI_REAL_RANDOM *)
DKC_EXTERN BOOL WINAPI dkcSemiRealRandomGet32 (DKC_SEMI_REAL_RANDOM *, uint32 *)
DKC_EXTERN uint8 WINAPI dkcSemiRealRandomGet1 (DKC_SEMI_REAL_RANDOM *)


説明

ほぼ真性乱数

作者:
d金魚
から:
2005/02/20
覚え書き:
dkcMath.hに書いていたのを別ファイルにした。
参考文献: http://www.interq.or.jp/snake/totugeki/hdrand.htm 2005/02/20

上記URLより引用

このプログラムを利用して発生したいかなる損害にも、作者とつげき東北は責任を負わない。各自の責任の下に使用すること。 改良、自作ソフトへの組み込み等は全て自由。このページの内容を著作権だけを変更して、そのまま自分のHPに書くようなことはしないように(著作権法に違反する)。 このページは2002/04/21に公開された。

hdrand.c Copyright(C) とつげき東北

dkcSemiRealRandom.h で定義されています。


マクロ定義

#define dkcdSEMI_REAL_RANDOM_BITS   64
 

dkcSemiRealRandom.h27 行で定義されています。

参照元 test().

#define dkcdSEMI_REAL_RANDOM_TRIAL_AND_ERROR_LIMIT   64
 

dkcSemiRealRandom.h25 行で定義されています。

参照元 dkcSemiRealRandomGet32(), と dkcSemiRealRandomInit().

#define dkcdSRR_TEMP_FILE_NAME   "secure_rand_temp.tmp\0"
 

テンポラリファイルの名前

dkcSemiRealRandom.h33 行で定義されています。

参照元 dkcSemiRealRandomInit().

#define dkcdSRR_TEMP_FILE_NAME_W   L"secure_rand_temp.tmp\0"
 

dkcSemiRealRandom.h34 行で定義されています。

参照元 dkcSemiRealRandomInit().


型定義

typedef struct dkc_SemiRealRandom DKC_SEMI_REAL_RANDOM
 


関数

DKC_EXTERN DKC_SEMI_REAL_RANDOM* WINAPI dkcAllocSemiRealRandom  ) 
 

覚え書き:

DKC_EXTERN DKC_SEMI_REAL_RANDOM* WINAPI dkcAllocSemiRealRandomFromGFS DKC_GENERIC_FILESYSTEM  ) 
 

dkcSemiRealRandom.c122 行で定義されています。

参照先 dkcAllocate(), dkc_SemiRealRandom::mpObj, と NULL.

参照元 dkcAllocSemiRealRandomWin32().

00123 {
00124     DKC_SEMI_REAL_RANDOM *p;
00125     if(NULL==pa){
00126         return NULL;
00127     }
00128     p = dkcAllocate(sizeof(DKC_SEMI_REAL_RANDOM));
00129     if(NULL==p){
00130         return NULL;
00131     }
00132     p->mpObj = pa;
00133     return p;
00134 }

DKC_EXTERN int WINAPI dkcFreeSemiRealRandom DKC_SEMI_REAL_RANDOM **   ) 
 

dkcSemiRealRandom.c137 行で定義されています。

参照先 dkcFree(), dkcFreeGenericFileSystem(), dkc_SemiRealRandom::mpObj, と NULL.

参照元 dkcAllocSemiRealRandomWin32().

00138 {
00139     DKC_SEMI_REAL_RANDOM *p = *pp;
00140     if(NULL==pp || NULL==p)
00141         return edk_FAILED;
00142     
00143     dkcFreeGenericFileSystem(&(p->mpObj));
00144     return dkcFree(pp);
00145 }

DKC_EXTERN uint8 WINAPI dkcSemiRealRandomGet1 DKC_SEMI_REAL_RANDOM  ) 
 

dkcSemiRealRandom.c326 行で定義されています。

参照先 generate().

00327 {
00328 #ifdef WIN32
00329     uint32 val;
00330     generate(ptr,&val);
00331     return (uint8) ( (val >> ptr->mRightShift ) & 1) ;
00332 
00333 #else
00334 
00335 
00336 #endif
00337 
00338 
00339 
00340 }

DKC_EXTERN BOOL WINAPI dkcSemiRealRandomGet32 DKC_SEMI_REAL_RANDOM ,
uint32 * 
 

dkcSemiRealRandom.c293 行で定義されています。

参照先 dkcdSEMI_REAL_RANDOM_TRIAL_AND_ERROR_LIMIT, FALSE, generate(), tmp, と TRUE.

00294 {
00295     uint32 tmp=0;
00296     uint32 val;
00297     int totalbit=0;
00298     size_t i,j;
00299     for(j=0;j<dkcdSEMI_REAL_RANDOM_TRIAL_AND_ERROR_LIMIT;j++)
00300     {
00301         if(FALSE==generate(ptr,&val))
00302             return FALSE;
00303 
00304         val = val >> ptr->mRightShift;
00305         for(i=0;i<ptr->mLeftShift;i++)
00306         {
00307             tmp+=val & 1;
00308             val=val >> 1;
00309             totalbit++;
00310             if(totalbit>=32){
00311                 *value32 = tmp;
00312                 goto End;
00313             }
00314             tmp=tmp<<1;
00315         }
00316     }
00317 
00318 End:
00319     if(!(j<dkcdSEMI_REAL_RANDOM_TRIAL_AND_ERROR_LIMIT))
00320     {
00321         return FALSE;
00322     }
00323     return TRUE;
00324 }

DKC_EXTERN int WINAPI dkcSemiRealRandomInit DKC_SEMI_REAL_RANDOM  ) 
 

dkcSemiRealRandom.c231 行で定義されています。

参照先 dkc_strcat2(), dkc_wcscat2(), dkcdMAXPATH, dkcdSEMI_REAL_RANDOM_TRIAL_AND_ERROR_LIMIT, dkcdSRR_PATH_SIZE, dkcdSRR_TEMP_FILE_NAME, dkcdSRR_TEMP_FILE_NAME_W, dkcmFORCE_NOT_ASSERT, と test().

00232 {
00233 #ifdef WIN32
00234 
00235     GetTempPathA_FT pGTPA;
00236     //char *pstr;
00237 
00238     GetTempPathW_FT pGTPW;
00239     //wchar_t *pwstr;
00240     
00241     if(ptr->mIsNT){
00242         pGTPW = (GetTempPathW_FT)ptr->fpGetTempPath;
00243         dkcmFORCE_NOT_ASSERT(dkcdMAXPATH < pGTPW(0,ptr->pPath));
00244 
00245         if(pGTPW(dkcdMAXPATH,ptr->pPath)==0)
00246              return edk_FAILED; //テンポラリファイルフォルダを取得
00247 
00248         //仮のテンポラリファイル。ちゃんとやるならGetTempFileNameで。
00249         if(DKUTIL_FAILED(dkc_wcscat2(ptr->pPath,dkcdSRR_PATH_SIZE,dkcdSRR_TEMP_FILE_NAME_W)))
00250         { 
00251             return edk_FAILED;
00252         }
00253 
00254     }else{//Win9x
00255         pGTPA = (GetTempPathA_FT)ptr->fpGetTempPath;
00256         dkcmFORCE_NOT_ASSERT(dkcdMAXPATH < pGTPA(0,ptr->pPath));
00257 
00258         if(pGTPA(dkcdMAXPATH,ptr->pPath)==0)
00259              return edk_FAILED; //テンポラリファイルフォルダを取得
00260 
00261         //仮のテンポラリファイル。ちゃんとやるならGetTempFileNameで。
00262         if(DKUTIL_FAILED(dkc_strcat2(ptr->pPath,dkcdSRR_PATH_SIZE,dkcdSRR_TEMP_FILE_NAME)))
00263         { 
00264             return edk_FAILED;
00265         }
00266     }
00267     {
00268         int i;
00269         for(i=0;i<dkcdSEMI_REAL_RANDOM_TRIAL_AND_ERROR_LIMIT;)//64回も行って成功しないは無いだろう・・・
00270         {
00271             if(0xFFFFFFFF==test(ptr,128,40,60)){
00272                 i++;
00273             }else{
00274                 break;
00275             }
00276         }
00277         if(!(i<64))
00278         {
00279             return edk_FAILED;
00280         }
00281     }
00282 
00283     return edk_SUCCEEDED;
00284 #else
00285 
00286 
00287 #endif
00288 
00289 }


dkutil_cに対してSat Sep 10 09:24:56 2005に生成されました。  doxygen 1.4.4