夜行録 - 酔歩.net

日暮れて道遠し さらに夜道を行く もって夜行録と名付く

random な文字列生成

調べてみたけど、ループ使うのばっかり(乱数1個ふって1文字を string に追加)ばっかりで萎え。

もっとさくっと作れると思ったんだがなぁ……。

hash 関数もナニだしなぁ…。

で、できたのが下のコード。
やっぱり for() が残ってるんじゃん…。とか、数値、文字、数値、文字と変換するのがイケてない…。

よく考えたらマスクとビットシフトってものがあるんだった。修正済み

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <assert.h>
  4. #include <time.h>
  5.  
  6. void randstring(char *Y, const unsigned int n) {
  7. static char _CHARTABLE[65] =
  8. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789@:";
  9. static int _N[5];
  10.  
  11. _N[0] = n &#38; 077;
  12. _N[1] = (n &#38; 07700) >> 6;
  13. _N[2] = (n &#38; 0770000) >> 12;
  14. _N[3] = (n &#38; 077000000) >> 18;
  15. _N[4] = (n &#38; 07700000000) >> 24;
  16. sprintf(Y, "%c%c%c%c%c", _CHARTABLE[_N[0]], _CHARTABLE[_N[1]],
  17. _CHARTABLE[_N[2]],_CHARTABLE[_N[3]],_CHARTABLE[_N[4]]);
  18. }
  19.  
  20. int main(void) {
  21. srand((unsigned) time(NULL));
  22. char _Y[16];
  23. randstring(_Y, rand());
  24. randstring(&#38;_Y[5], rand());
  25. randstring(&#38;_Y[10], rand());
  26. printf("]%s[\n",_Y);
  27. }

キモは、A-Za-z0-9は62文字なので、まるめて64文字6bitあればいいというのと、それが8進2桁になること。4byte整数があれば5文字作れるはず。

てか、タダの base64 の変種だな。まあ、自作の乱数クラスにはっつけとけば、なにかに使うだろう。

2010年01月07日 (Thu) - 19:01:54 - その他雑記 - 255x - permalink
Karma points: 2. Do you like this article? [yes/no]