夜行録 - 酔歩.net
日暮れて道遠し さらに夜道を行く もって夜行録と名付く
random な文字列生成
調べてみたけど、ループ使うのばっかり(乱数1個ふって1文字を string に追加)ばっかりで萎え。
もっとさくっと作れると思ったんだがなぁ……。
hash 関数もナニだしなぁ…。
で、できたのが下のコード。
やっぱり for() が残ってるんじゃん…。とか、数値、文字、数値、文字と変換するのがイケてない…。
よく考えたらマスクとビットシフトってものがあるんだった。修正済み
#include <stdio.h> #include <stdlib.h> #include <assert.h> #include <time.h> void randstring(char *Y, const unsigned int n) { static char _CHARTABLE[65] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789@:"; static int _N[5]; _N[0] = n & 077; _N[1] = (n & 07700) >> 6; _N[2] = (n & 0770000) >> 12; _N[3] = (n & 077000000) >> 18; _N[4] = (n & 07700000000) >> 24; sprintf(Y, "%c%c%c%c%c", _CHARTABLE[_N[0]], _CHARTABLE[_N[1]], _CHARTABLE[_N[2]],_CHARTABLE[_N[3]],_CHARTABLE[_N[4]]); } int main(void) { srand((unsigned) time(NULL)); char _Y[16]; randstring(_Y, rand()); randstring(&_Y[5], rand()); randstring(&_Y[10], rand()); }
キモは、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]
Karma points: 2. Do you like this article? [yes/no]
- Use this Trackback URL for ping (right mouse click and copy URL).
- You can [print] this article, [email] it, or export a [PDF].
