Как лучше генерировать соль рандомно или по каким нибудь данным пользователя?
Для безопасности - без разницы.
Для удобства - смотрите как вам удобней.
Для безопасности "соль" генерируют рандомно и хранят рядом с паролем в базе. Можно дополнительно усложнить алгоритм добавив секретную величину - "перец", которая хранится отдельно.