Целочисленные идентификаторы / GUID / массивы байтов любого размера могут быть достаточно надежными на практике, но все они не соответствуют теоретическим требованиям (коллизии случаются), в то время как правильное теоретическое решение существует и может применяться большую часть времени.1001 *
Я бы сформулировал решение так: в системе взаимодействия на равном уровне личность должна быть гарантирована системой более высокого уровня.Система более высокого уровня управляет временем жизни взаимодействующих систем.
Пример :
class John
{
private readonly int id;
public John(int id)
{
this.id = id;
}
public void UseSite(Site site)
{
site.CreateAccount(id, "john");
site.SetPassword(id, "john", "123");
/* ... */
}
}
class Site
{
public void CreateAccount(int humanId, string accName) { /* ... */ }
public void SetPassword(int humanId, string accName, string pwd) { /* ... */ }
/* ... */
}
class Program
{
static void Main(string[] args)
{
Site s = new Site();
// It's easy to guarantee the identity while there's only one object
John j = new John(4);
Console.ReadLine();
}
}
Program
- это модуль более высокого уровня.Он несет ответственность за правильное использование John
и Site
.Предоставление John
уникального идентификатора является частью этой ответственности.
Вы обнаружите, что невозможно или очень трудно иметь дело с идентичностью некоторых реальных систем, таких как человек.Это происходит, когда эти системы находятся на одном уровне с вашей системой.Типичным примером является человек и веб-сайт.На вашем сайте никогда не будет гарантии, что право человека запрашивает страницу.В этом случае вы должны использовать вероятностный подход с надежным хешем.