Здравствуйте, TailWind, Вы писали:
TW>Как сделать случайный пароль на 24 символа?
TW>И потом ещё один такой же
TW>Нужно чтобы между символами и паролями не было математической зависимости
TW>То есть rand(), rand(), rand(), rand() не подходит
TW>Единственное, что мне пришло в голову rand(GetTickCount())
TW>Но этого мало. А дальше то как?
void gen_random(TCHAR *s
, const int len
, const TCHAR* pszSymbols
, const UINT nSizeSymbols)
{
for (int i = 0; i < len; ++i) {
//const TCHAR sz== alphanum[rand() % (nSizeSymbols - 1)]
const TCHAR sz = *(pszSymbols+ (rand() % (nSizeSymbols - 1)));
s[i] =sz;
}
s[len] = 0;
}
void gen_random(TCHAR *s, const int len, const bool bSpecialSymbols)
{
const TCHAR alphanum[] =
TEXT("0123456789")
TEXT("ABCDEFGHIJKLMNOPQRSTUVWXYZ")
TEXT("abcdefghijklmnopqrstuvwxyz");
const TCHAR szSpec[]=TEXT("!@#$%^&*()_-\\/|\"'~");
typedef std::vector<TCHAR> V;
V v;
UINT nSize=ARRAYSIZE(alphanum);
if (bSpecialSymbols)
nSize += ARRAYSIZE(szSpec);
nSize += 1;
v.reserve(nSize);
std::back_insert_iterator<V> bi(v);
std::copy(alphanum,alphanum+ARRAYSIZE(alphanum),bi);
const int nnnsdfs=v.size();
if (bSpecialSymbols)
std::copy(szSpec, szSpec+ARRAYSIZE(szSpec),bi);
const int nsd=v.size();
gen_random(s, len, &v[0],v.size());
}
CString Generate(const UINT nMaxLen,const bool bUseSpecSymbols)
{
ASSERT(nMaxLen > 0);
if (0 == nMaxLen)
return TEXT("");
enum {MAX_LEN=1000};
if (nMaxLen > MAX_LEN) {
ASSERT(FALSE);
return TEXT("");
};
TCHAR sz[MAX_LEN+1];
gen_random(sz,nMaxLen,bUseSpecSymbols);
ASSERT(!IsBadStringPtr(&sz[0],INFINITE));
CString s(sz);
UINT nTryCount=0;
enum {MAX_TRY_COUNT=10};
while (nTryCount < MAX_TRY_COUNT) {
if (s.GetLength() == nMaxLen)
break;
++nTryCount;
s=Generate(nMaxLen,bUseSpecSymbols);
};
return s;
}