No it is not possible to determine that is produced by a hashing algo, or which one that produced it -- at least not from a single sample.
Good hashing algo will produce a uniform set of values across the entire range of possible values -- where modern algo produces values from 128 to 512 bit in width, but if we take it back to a simpler example that may be easier to understand and suppose that you hashing algo only produced values between 1 and 10, then for it to be a good algo it should produce any of the values 1 to 10 with equal likelihood.
If you were just given one value "7" you would not know if it was generated by the hashing algo, or by some other means -- there is simply not sufficient evidence.
Different hashing algo's may however have different weaknesses, so say our simple algo had a flaw that would make it more likely to produce the value 7 than the value 5, and supposed we had a million values that was generated by some hashing algo unknown to us but had the same distribution of fewer 5 and more 7's we could say that it would be likely to be generated by that hashing algo, but not certain.
As for your suggestion of Rainbow tables -- rainbow are easy to foil -- add salt or do multiple iterations of hashing -- something as simple as just sticking the letter 'a' in front of the input of 'string' gives a md5 of b9a15c6d632a44e7eb75d000e1dba40b which according to google does not appear in any public rainbow tables, so with a bit ingenuity of adding random salt and it would be hard to determine that the value is a md5 even with a rainbow table.