Does it make a difference to run xgboost on hot encoded variables or single factor variable? I have a dataset, that has a categorical "products" column. It has some 1000 distinct values.
Can I directly convert it to integers (say 1-1000) and use this column as a single variable or should I convert it to dummy coding 1/0 for all products as columns? Does it make a difference?
 A: Yes, it makes a difference. There is no good answer, you should try both. If you are looking for performance, you may even need to try various encodings and stack the models with the different ecodings...
Another approach could be to replace the factors (with a relatively large number of occurences) by the conditional average value of the target.
Edit.
As for the why, the reason comes from the fact that boosting are based on decision trees. 
Imagine the factor column represents a country. If you encode it as an integer, the decision rule will read as if country > 10. This groups will represent all the countries that do not correspond to the first 10 countries (and the order of encoding will matter).
On the other hand, if you encode it with dummy variables, the generated rules will be if country10 > 0.5 (and this may correspond to a specific country : country10 == 1). Now (if you don't subsamble the columns when growing a tree), the performance of the model will be the same regardless of the encoding.
Towards an optimal integer encoding ?
Do you have information on the products ? Or is it just an ID ? If you could range your products so that 1-100 are, say, cellphones, 101-300 cars, 301 - 1000 books, it may help your algorithm to find groups with an actual meaning (now the rule if product > 300 automatically refers to all the books... There is absolutely no guarantees of improvement of performance with this method though.
