Да и в реализации функции у тебя тоже небольшой изъян: если случайно выпадает один из "опасных" символов, вместо него выбирается один из следующих ('\"', '(', ']'), из-за чего вероятность возникновения этих трёх символов в строке становится в 2 раза больше, т.е. символы распределяются неравномерно.
Равномерную выборку можно сделать примерно так:
GenerateSalt(buf[], len = sizeof(buf))
{
--len;
for (new i = 0, c; i < len; i++)
{
c += _:(c >= '%') + _:(c >= '\'') + _:(c >= '\\');
}
buf[len] = '\0';
return len;
}