Yes, and a very tough one to make.
The wiki states somewhere (can't find the page now, of course) that the probability of a single hash calculation solving a block is
target
-------
2256
and the average number of hashes required to solve a block is its inverse:
2256
-------
target
Let's call that last formula A. On average, then, it takes A hashes to solve a block. We know how long it takes to create a particular block (just take its creation timestamp and subtract the timestamp of the previous block from it). So the network hash rate is simply A / timespan.
Of course, individual blocks will be highly variable due to the random nature of finding a solution (there were about 3 or 4 blocks recently that were created within 5 minutes; the block before that series took 20 minutes, as did the block after). To get a more accurate estimate, you'd want to take the time over 50 or 100 blocks. The formula is:
2256 * n
-----------------------
target * (tsN - tsN-n)
where
n is the number of blocks you're sampling
tsx is the timestamp of block number x
N is the latest block number (or whatever block number you want to end your sample range with)
and target is currently 0xCBBD000000000000000000000000000000000000000000000000