Everyone has this problem and the solution is simple: Guarantee uniqueness by assigning every person a unique number. The problems with this are that people feel numbers to be impersonal (as if most of these schemes are not!) and that numbers can be harder to remember or distinguish from other numbers. Attempts to avoid this problem with clever schemes will, as you point out, lead to trouble.
There are no good answers, but here's a bad one that I like: assign each person a name-based username and then *always append a numeric suffix*, so that each name is e.g. firstname.lastname.123@host. Of course you have to deal with the fact that nobody really knows what a name is, allow for exceptions and never hard-code this assumption in to any software.
Perhaps the best way to name people is to use something like DNS. A unique number that identifies plus a global name-to-number resolution system, which is non-authoritative and permitted to change over time, geography, etc.. Of course, then you'd need to know he point in time and locality to know how to resolve the name... which is pretty much where we are now.