調べてみたけど、ループ使うのばっかり(乱数1個ふって1文字を string に追加)ばっかりで萎え。
もっとさくっと作れると思ったんだがなぁ……。
hash 関数もナニだしなぁ…。
で、できたのが下のコード。
やっぱり for() が残ってるんじゃん…。とか、数値、文字、数値、文字と変換するのがイケてない…。
よく考えたらマスクとビットシフトってものがあるんだった。修正済み
#include <stdio.h> #include <stdlib.h> #include <assert.h> #include <time.h> "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789@:"#38; 077; _N[1] = (n & 07700) >> 6; _N[2] = (n & 0770000) >> 12; _N[3] = (n & 077000000) >> 18; _N[4] = (n & 07700000000) >> 24; "%c%c%c%c%c"#38;_Y[5], rand()); #38;_Y[10], rand()); "]%s[\n",_Y); }
キモは、A-Za-z0-9は62文字なので、まるめて64文字6bitあればいいというのと、それが8進2桁になること。4byte整数があれば5文字作れるはず。
てか、タダの base64 の変種だな。まあ、自作の乱数クラスにはっつけとけば、なにかに使うだろう。