I'm looking for an algorithm that finds the poker combinations (specifically straight, flush, full house, four of a kind, and straight flush) in a set of 13 cards. The most naive implementations is to check each element in a power set of the cards (hence 1287 possible combinations), but experience tells me there is always a better way.

Brother Bob's approach is the best and traditionally used one, also in the case when joker cards are present. Even though the logic needs to be carefully thought out, it will beat a naive "check all 5-subsets of 13 cards".

Brother Bob's idea is generally right, but there is a representation of the hand that allows for much faster code: Store each suit as a 13-bit integer, indicating which cards are present in the hand.

Since 2^13 = 8192 is a reasonably small number, you can aid the algorithm by using a few precomputed tables, with things like what is the highest bit set in a word, or what is the highest bit of a group of at least 5 consecutive bits (to detect straights).

straight
look for cards with the same face value, keep only one of them in the temporary deck
sort, look for cards with consecutive face values
5+n consecutive cards = n+1 straights (so far)
substitute cards in the straight with the same face value, add each to list
flush
sort the cards by suite,
5+n cards with the same suite = n+1 flushes
full house
sort cards, look for cards that occur >= 3. if none, quit
look for cards that occur in pairs.
C(n1,3) . C(n2,2) for faces that occur >= 3.
C(n,3) . pairs
4 of a kind
sort cards, look for 4 same face values
5th card any other card
straight flush
use previously found straights and flushes, avoid duplicate combinations