tl;dr contract addresses are always unique as they are determined based off the address creating the account, and the nonce of that address. This means that no two contracts will have the same address, but that with a bit of trial and error we can easily make contracts with "vanity" addresses. See below
The address of a contract is determined based on the address of the account creating the contract, and the nonce of the account. So when you use an account to deploy a contract, that contract starts off with a nonce of 1, that is only created during contract creation,aka when the create
opcode is called. This means you can EASILY pre-calculate the addresses of contracts that will be generated by an account (be that a contract account, or an EOA).
So to get a contract address that is slightly customized, you would have to try multiple different public/private key pairs to see which one will generate an address that you want. I wrote a contract that can be used to calculate addresses:
https://github.com/postables/Solidity-Modules/blob/master/Contracts/AddressGenerationCalculator.sol