The left-hander, who was the 2002 AL Cy Young Award winner, outlasted San Diego's Chris Young, but the early homers did him in. Zito held San Diego to five hits while walking four and striking out three.
"I felt good," Zito said. "I had good stuff. I wish I could take back the two homers."
Zito dropped to 1-4, but he's allowed only 10 earned runs in his last 40 2/3 innings to lower his ERA from 10.00 to 3.62.
"I'm not really going for stats," Zito said. "Tried that, it didn't work too well. It's a frustrating loss for the team."
Zito was 21-30 the last two seasons. Last year he started 0-8 with a 6.25 ERA, on his way to a career-worst 17 losses.
"I've been here before, early," he said. "I'm just glad I'm throwing the ball the way I am at this point of the season. I'm feeling good about things. There's nothing productive out of me getting frustrated."
Zito is getting the worst run support in the majors, just 1.25 runs per game.
"That's just the way baseball is," he said. "I'm giving my team a chance to win. It's still early in the season."
Zito pitched his 10th career complete game and first since Aug. 7, 2003, with Oakland at Detroit.
The Padres were impressed.
"I think he's been really pitching effective this whole year, really returning to form," said Hairston, who drove a fastball into the second deck in left-center with two outs in the first for his fifth homer.
"His pitching style is a lot different from what it was last year," Hairston added. "I think he's able to make those pitches with two strikes, in and out. At times, he can throw any pitch for a strike. And his curveball's working really well, too. That's his signature pitch his whole career. He snapped off some really good ones tonight."
Hundley homered to center on a changeup with two outs in the second, his third.
"He's thrown the ball really well against us," Hundley said. "I've faced him four times and that's as good of a curveball as I've seen."
The Padres won their fourth straight game. Randy Winn had three hits for the Giants, who lost for the fifth time in six games and dropped to .500.
Young (3-2) won for the first time in seven starts, holding the Giants to one run and five hits in six innings, with six strikeouts and three walks.
Young's previous win was April 12 against the Giants on the final day of the Padres' opening series, when he improved to 2-0. He went 0-2 in his next six starts, including a no-decision in a 1-0, 10-inning loss at San Francisco on April 22. Zito also got a no-decision that day.
Heath Bell pitched a perfect ninth for his 10th save in 10 chances.
San Francisco had plenty of baserunners but couldn't bring them in. The Giants' leadoff batter got to second base with no outs in three of the first four innings, but didn't score.
"It's not ideal," Young said. "You want to keep the leadoff guy off. More often than not, that guy's going to score if you get the leadoff guy on. I was able to make some pitches and get popups and not allow that guy to advance in key situations."
Giants manager Bruce Bochy wasn't happy with his offense.
"It comes down to executing," Bochy said. "We were awful tonight. We couldn't get a productive out. When you're in a tight ballgame, it's going to come back to hurt you, and it did."
The Giants finally got a run on Emmanuel Burriss' grounder in the sixth.
Winn has reached safely in 31 of his 37 games. ... Padres relievers haven't allowed a run in their last 17 1/3 innings. ... Juan Uribe (bereavement leave) might rejoin the Giants on Wednesday and could be activated Thursday. ... Padres manager Bud Black said it was more than likely that ace Jake Peavy would start Friday. He beat the Cincinnati Reds 3-1 with a four-hitter on Sunday. The Padres were off Monday, so Peavy would be getting his normal four days' rest.