My pool always seems to think I have a much lower hashrate than what I see locally. The only thing I can think of is that my pool moves onto the next block before my computer submits hashes, but my ping time is just 83 ms and my connection log shows no errors.
The hashrate that is reported by the pool is an average over some time period - for example the original core pool implementation uses a window of 10 minutes (600 seconds) to compute the average.
Your miner probably reports the average hashrate over a shorter window.
That could be the reason why you may observe discrepancies at a particular moment in time (if your miner has mined more slowly at some point over the past 10 minutes).
That's because the pool bases your speed on valid shares you submit, since that is luck based you may submit 2 tight after each other, then have a gap (simplified). During that time you submit 2 close together the pool sees you as much faster, but I've time it averages to the number you are expecting