Reusing the same salt means that if the user is clearly targeted by the hacker, they can create a dictionary of "password to hash" using the "user salt" - so even if the user changes his password, the hacker will still immediately recognize the new password no extra work.
I will use different salts every time.
As for storing the MD5 hash plus salt - presumably you already store the salt + hash to check the current user password. Why can't you just keep the same information for historical checks? Thus, you can use one piece of code to verify the password, and not to separate the current and historical paths. They do the same, so it makes sense to use the same code.
EDIT: To explain what I mean, consider a 4-character salt added to the password ... and for the sake of argument, imagine that someone uses only AZ, az and 0-9 in their password (and salt).
If you do not know the salt ahead of time (when preparing a dictionary attack), then in order to prepare a dictionary for all 8-character "human" passwords, you need to use hashed 62 ^ 12 concatenated passwords. If, however, you always know what the first 4 characters of a concatenated password will be (because you know the salt ahead of time), then you can only get away with hashing 62 ^ 8 values - everything that starts with salt. This makes salt useless against this particular attack.
This only works with the target user - and only if the attacker can get into the hash list both before and after changing the password. This basically makes password changes less effective as a security measure.
source share