How is the network hash rate calculated? Miners work on finding blocks but don't sent anything until they find the block.

Considering that, how can sites like bitcoincharts.com display a graph of the network hash rate?
The hashrate can be calculated from the expected rate of finding a block (144 a day), the actual rate of finding a block and the current difficulty.

So let's calculate the average hash_rate for a single day:

expected_blocks = 144
difficulty = 11187257.461361 # this is on May 22nd 2013
blocks_found = 155 # Also May 22nd 2013
hash_rate = (blocks_found/expected_blocks*difficulty * 2**32 / 600)


The reason we use a day to average out the hash_rate is that taken block by block the variance would be really high and we would not get anything meaningful.

According to WolframAlpha this gives us an averagge hash_rate for the 22nd May 2013 of 86.19 THashes/s. Numbers of course may vary depending on how you chose your interval, which appears to be the reason numbers don't match with the ones on Blockchain.info