ah, we once tried a hash based calculation but gave it up as a bad job. At new_block , we'd find that reported hash rates where all conflicting causing massive forking. We decided to do this in short:-
if a block is targeted @ 5 minutes, that means 12 blocks an hour. to compensate for hash swings and lucky breaks we can consider a two hour period. this means adjustment every 24 blocks (this can be even 4 hour periods), going up twice quickly as it goes down. It inconveniences cloud and bot operators due to the quick re-adjustments, benefiting small loyal miners who only feel the brunt when a bot tries to jump in. Otherwise returns will be normal across the board.
We could try hashrate based implementation but if you consider how there are many complaints about clients and latency, it would be prudent to use a metric that has less room for error.