O struct Guid representa um identificador único global: um valor de 16 bytes que, se gerado randomicamente, irá gerar um identificador (quase) único.
É óbvio que GUIDs gerados podem colidir. Desde de que os GUIDs possuem 128 bits, basta gerar 2^128+1 deles (não é tão simples como escrever isso) e pelo princípio de pombal deve haver uma colisão. Quando dizemos que um GUID é único, o que realmente queremos dizer é que o espaço da chave é tão grande que é praticamente impossível para gerar acidentalmente o mesmo GUID duas vezes (assumindo que estamos gerando GUIDs aleatoriamente).
O princípio do pombal ou princípio da casa dos pombos é a afirmação de que se n pombos devem ser postos em m casas, e se n > m, então pelo menos uma casa irá conter mais de um pombo. Matematicamente falando, isto quer dizer que se o número de elementos de um conjunto finito A é maior do que o número de elementos de um outro conjunto B, então uma função de A em B não pode ser injetiva. É também conhecido como teorema de Dirichlet ou princípio das gavetas de Dirichlet, pois supõe-se que o primeiro relato deste principio foi feito por Dirichlet em 1834, com o nome de Schubfachprinzip (“princípio das gavetas”).
O princípio do pombal é um exemplo de um argumento de calcular que pode ser aplicado em muitos problemas formais, incluindo aqueles que envolvem um conjunto finito.
Embora se trate de uma evidência extremamente elementar, o princípio é útil para resolver problemas que, pelo menos à primeira vista, não são imediatos. Para aplicá-lo, devemos identificar, na situação dada, quem faz o papel dos objetos e quem faz o papel das gavetas.
Quantas pessoas são necessárias para se ter certeza que haverá pelo menos duas delas fazendo aniversário no mesmo mês? Resposta: 13 pessoas. Pelo princípio da casa dos pombos, se houver mais pessoas (13) do que meses (12) é certo que pelos menos duas pessoas terão nascido no mesmo mês.
Fonte: http://pt.wikipedia.org/wiki/Princ%C3%ADpio_de_Pigeonhole
Os guids são usados para chaves e outros cenários onde um identificador único seja necessário.
Existem identificadores de 2^128 a 3.4 x 10 ^38. Para criar um novo Guid randômico basta chamar o método estático Guid.NewGuid():
Para instanciar um valor existente podemos usar um dos seguintes construtores:
public Guid (byte[] b); // Aceita um array de 16 byte public Guid (string g); // Aceita uma string
Quando representando como uma string, um Guid é formatado como um número hexadecimal de 32 dígitos, com hífens opcionais depois do oitavo, décimo segundo e vigésimo dígito.
A string inteira pode também ser envolvida por colchetes [] ou chaves {}:
O método ToByteArray converte um Guid para um array de bytes. A propriedade Guid.Empty retorna um Guid vazio (todos com zeros).