Zimbabwe captain Craig Ervin won the toss and elected to bat first on Thursday but despite a promising start, his side crumbled on either side of two rain breaks to be dismissed for 96 in just the 23rd over.
The match had been reduced to 27 overs per side after two long rain interruptions but it didn't stop the visitors folding tamely at the hands of Hasaranga before Sri Lanka reached 2-97 with more than 10 overs to spare.
Kusal Mendis did most to guide them home, scoring his 27th ODI half-century as he went on to make 66 off 51 balls.
Zimbabwe openers Joylord Gumbie and Takudzwanashe Kaitano gave the tourists a promising start, adding 40 before rain interrupted play in the eighth over.
Hasaranga, who missed the World Cup because of injury, struck soon after the stoppage, having Kaitano caught at fine-leg by Dilshan Madushanka.
Soon he trapped Gumbie lbw for 29 and Ervin without scoring to leave Zimbabwe at 3-48 at the second rain stoppage.
When play resumed, Hasaranga got into action again, trapping Milton Shumba (2) lbw.
Hasaranga went on to end up with the second-best haul for Sri Lanka all-time in one-day internationals after Chaminda Vaas took 8-19 against Zimbabwe 23 years ago.
Seamer Janith Liyanage bowled Ryan Burl (9) and a ball from spinner Maheesh Theekshana bounced off wicketkeeper Mendis' pads stumping Sikander Raza for 10.
Sri Lanka lost Avishka Fernando early in their chase, caught behind by Gumbie off left-am seamer Richard Ngarava without scoring. Fernando made just four runs in the three innings he batted in the series.
Mendis and Shevon Daniel shared 73 runs for the second wicket before Daniel was caught in the deep by Milton Shumba off spinner Wellington Masakadza for 12.