It seems to be a matter of preference as to whether the square is filled or not- as a UK undergraduate, the empty square was rarely encountered, but that seems to have been Halmos' original choice. Unicode merely specifies an end of proof symbol U+220E, which renders as empty in Internet Explorer, but filled in Firefox: your browser presents it (if at all) as ∎. Default behaviour in AMSLaTeX is an empty square, which is automatically placed at the end of theorem proofs; for those who prefer a solid square, include the following code in the preamble:

Perhaps the strangest variation I encountered was by one of my Russian lecturers, who would use a circle instead of a square- indicating the start of a proof with an empty circle, and the end with a solid disc. He applied the same procedure to examples, but with triangles instead of circles. I suspect this was a personal quirk rather than an established tradition, however.