The diminutive left-hander cracked 138 off 154 balls to help Australia post a winning total of 247 for five after being put in to bat.
Hughes, who became the first Australian to score a century on his ODI debut in the first game in Melbourne, nonetheless admitted he found the going hard.
“I know if you do get in it's something I pride myself on, to get that three-figure mark,” he said. “When I got to 50-60 I was finding it tough to score, but I got a few at the back end.”
Playing his last game as captain, Sri Lankan skipper Mahela Jayawardene sprung some surprises in fine weather at the Bellerive Oval.
He won the toss and put Australia in to bat on what looked a good wicket and threw off-spinner Tillakaratne Dilshan the new ball.
It was unorthodox but he was quickly rewarded with three maidens and an early wicket.
Dilshan found some unexpected grip and stunned David Warner, who pushed an outside edge onto off-stump with the score on 31. Warner made 10 off 18 balls.
There was little or no swing for Nuwan Kulasekara, who won the player of the series award after swinging the ball prodigiously in Brisbane and Sydney, but he had Matthew Wade out lbw for 23 after missing a straight one.
Australia, missing skipper Michael Clarke who failed a late fitness test on a twisted ankle, looked in trouble again with two wickets down for 37.
Sri Lanka had seized a 2-1 lead in the series on Friday, bowling out Australia for just 74 in Brisbane. The tourists had also looked favourites to win the fourth leg before a rain wash-out in Sydney on Sunday.
In Hobart, the Sri Lankan attack tied up replacement captain George Bailey as the overs went by.
Hughes had a let-off with a mis-hit that rolled onto his stumps but failed to remove the bails. That seemed to spark him into life and a steady 50 came up off 82.
Thisara Perera broke the Hughes-Bailey partnership of 60 off 100 balls when he caught and bowled the latter for 17 off 43 balls.
Hughes was repaid handsomely for his gritty patience in the final overs, adding a towering six to his 13 fours.
David Hussey tried to stay with him but Perera ran him out off his own bowling going for an invisible run.
All-rounder Glenn Maxwell threw the bat and was duly caught at extra cover off Lasith Malinga for 9.
Sri Lanka faced a required run rate of 4.94 an over but Jayawardene looked on song, driving two early boundaries.
The tourists had cruised to 50 off 10 overs when the skipper, on 38, inexplicably chipped Xavier Doherty to Mitchell Starc at mid-on.
A mini-collapse ensued as Lahiru Thirimanne lofted Doherty to a grateful David Hussey at long-on. The spinner then clean-bowled Dinesh Chandimal for six.
Australia stifled the Sri Lankans for long periods and as the required run rate climbed, the tourists started to look desperate.
Stand-in keeper Kushal Perera went trying to hit out as the required rate topped 10 an over. He was caught by Warner off Mitchell Johnson for 14.
Potential future captain Angelo Mathews finally found some timing and the boundary, ably supported by Jeevan Mendis.
But medium-pacer Moises Henriques bowled Mendis for 26 and dismissed Mathews for 67 with the score still on 187 and seven wickets down.
The Sri Lanka tail failed to wag and Clint McKay cleaned up the last two wickets cheaply.
The tour ends with two T20 games in Sydney on Saturday and Melbourne on Monday.