memo: HDDを破棄するべく内容を消去する

GNU shred を使えばいいんだけど、乱数ソースの /dev/urandom がいかんせん遅い。ので適当にマルチスレッドで rand(3) 関数を使って乱数を吐くプログラムを作ってみた。

rand(3)関数自体はあんまり乱数として質が良くないとかいう話は聞くけど

  • 複数スレッドで rand(3) を呼ぶことによる非決定性 (rand(3)はリエントラントではない)
  • メインスレッドで sleep(1); srand(clock()); を繰り返し実行することによる非決定性

があるので、ある程度はランダムネスが確保できているのではないかと。並列プログラムのややこしい性質である非決定性を、乱数の強度を補うために使ってみたつもりなんだけど、実際問題として効果があるかどうかは自信がない。

とりあえずソースはgithubに上げてある。

http://github.com/hayamiz/Parandom

ユニプロセッサ環境だとそんなに速度でないかも。うちのマシン(Core2 Duo CPU U9300)だと

  • /dev/urandom : 2.8 MB/s
  • parandom : 19.2 MB/s

と、およそ 6.8 倍の速度で乱数ソースを生成することができるようになった。多分パラメータをチューニングすればもうちょっとは速くなると思う。


力武さん( @jj1bdx ) に教えていただいた SFMT(SIMD-oriented Fast Mersenne Twister) を乱数生成に使うようにしたら爆速になった。

Core2 Duo CPU U9300 で 180 MB/s !

(止められないのでやむやく)他のプロセスを動かしながら計測した Atom 330 でも 90 MB/s と高速。これでボトルネックは完全にHDDの書き込み速度になった。