Re: Как уникально идентифицировать объекты
От: Kisloid Мухосранск  
Дата: 17.12.07 13:19
Оценка: 1 (1) +2
Здравствуйте, <Аноним>, Вы писали:

А>Есть некая система в которой есть группы некоторых объектов. Объекты внутри каждой группы должны уникально идентифицироваться (по крайней мере в пределах этой группы). Причем лучше (удобней и красивей) если это будет происходить автоматически, без участия пользователя этой системы.


Может так?
private Guid guid = Guid.NewGuid();
... << RSDN@Home 1.2.0 alpha rev. 786>>
((lambda (x) (list x (list 'quote x))) '(lambda (x) (list x (list 'quote x))))
Re[3]: Как уникально идентифицировать объекты
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 18.12.07 08:30
Оценка: -3
Здравствуйте, lollipop, Вы писали:

L> +1 .

L>Только из всего топика так и непонял есть же GUID может можно его использовать? Пусть генерится и сравнивается. Но зато уникальность какая
Стрельба из пушки по воробьям. Тем более при маленьких объектах — перерасход памяти.
GUID необходимо использовать если объекты будут выходить за пределы одного приложения.
Re: Как уникально идентифицировать объекты
От: apps Россия  
Дата: 17.12.07 13:21
Оценка: 3 (2)
Здравствуйте, Аноним, Вы писали:

А>Но эта фишка, как оказалось, не делает того что нужно — при создании подря нескольких объектов, их поле key инициализируется один и тем же значением. Что, как упоминалось выше, неприемлемо.


А>Какие здесь возможны подходы?


System.Runtime.CompilerServices.RuntimeHelpers.GetHashCode(obj);

Если нужно получить уникальный (в рамках домена Арр-Domain) идентификатор объекта, не следует вызывать метод GetHashCode типа Object.

Этот метод возвращает то же значение, которое возвратил бы метод GetHashCode типа Object; однако, если в типе метод GetHashCode типа Object переопределен, не удастся получить уникальный идентификатор объекта.

Тем не менее в FCL есть метод, который нужно вызывать для получения уникального идентификатора объекта. В пространстве имен System.Runtime.CompilerServices обратитесь к открытому статическому методу GetHashCode класса RuntimeHelpers, который принимает в качестве аргумента ссылку на Object.

Этот метод возвращает уникальный идентификатор для объекта, даже если в типе объекта метод GetHashCode переопределен.

Джеффри Рихтер "CLR via C#"

Если нам не помогут, мы тоже никого не пощадим...
Re: Как уникально идентифицировать объекты
От: Neco  
Дата: 17.12.07 12:52
Оценка: -2
А>Какие здесь возможны подходы?
GetHashCode()?
всю ночь не ем, весь день не сплю — устаю
Re[2]: Как уникально идентифицировать объекты
От: Mika Soukhov Stock#
Дата: 19.12.07 10:59
Оценка: 1 (1)
Здравствуйте, apps, Вы писали:

A>Здравствуйте, Аноним, Вы писали:


А>>Но эта фишка, как оказалось, не делает того что нужно — при создании подря нескольких объектов, их поле key инициализируется один и тем же значением. Что, как упоминалось выше, неприемлемо.


А>>Какие здесь возможны подходы?


A>
A>System.Runtime.CompilerServices.RuntimeHelpers.GetHashCode(obj);
A>


Этот метод лишь средство для получения невиртуального значения хеша. Для получения идентификаторов нужно использовать класс ObjectIDGenerator.
Re[3]: Как уникально идентифицировать объекты
От: Neco  
Дата: 17.12.07 13:13
Оценка: :)
А> Но ведь его тоже надо как-то реализовывать. Среда AFAIK отнюдь не гарантирует уникальность значений по GetHashCode
меня пока не подводила
я думаю, что GetHashCount базируется на тех же tick'ах, только к ним приплюсовывается к примеру адрес в памяти (я бы примерно так реализовал бы это) — будет фактически уникально, мне кажется.
если хотите можете повысить уникальность через
            object obj = new object();
            Random rnd = new Random(DateTime.Now.Millisecond);
            string uniq = obj.GetHashCode().ToString() + "|" + DateTime.Now.Ticks.ToString() + "|" + rnd.Next(int.MaxValue);


а вообще уникального ничего нет — sequence у оракла тоже не бесконечен, но ведь пользуются и работает же
всю ночь не ем, весь день не сплю — устаю
Re: Как уникально идентифицировать объекты
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 17.12.07 13:23
Оценка: +1
Здравствуйте, Аноним, Вы писали:

А>Есть некая система в которой есть группы некоторых объектов. Объекты внутри каждой группы должны уникально идентифицироваться (по крайней мере в пределах этой группы). Причем лучше (удобней и красивей) если это будет происходить автоматически, без участия пользователя этой системы.


А>Пробовал такой подход:

А>
А>public SomeObject()
А>{
А>...
А>   this.key = DataTime.Now.Ticks.ToString();
А>...
А>}
А>


А>Но эта фишка, как оказалось, не делает того что нужно — при создании подря нескольких объектов, их поле key инициализируется один и тем же значением. Что, как упоминалось выше, неприемлемо.


А>Какие здесь возможны подходы?


А так:

public static class GlobalCounter
{
    private static uint _value=0;
    public static uint GetNextValue()
    {
        return _value++;
    }
}

...

public SomeObject()
{
...
   this.key = GlobalCounter.GetNextValue();
...
}
Re: Как уникально идентифицировать объекты
От: Hike  
Дата: 17.12.07 15:57
Оценка: +1
Здравствуйте, Аноним, Вы писали:

А>Есть некая система в которой есть группы некоторых объектов. Объекты внутри каждой группы должны уникально идентифицироваться (по крайней мере в пределах этой группы). Причем лучше (удобней и красивей) если это будет происходить автоматически, без участия пользователя этой системы.


А>Пробовал такой подход:

А>
А>public SomeObject()
А>{
А>...
А>   this.key = DataTime.Now.Ticks.ToString();
А>...
А>}
А>


А>Но эта фишка, как оказалось, не делает того что нужно — при создании подря нескольких объектов, их поле key инициализируется один и тем же значением. Что, как упоминалось выше, неприемлемо.


А>Какие здесь возможны подходы?


Можно сделать и так:


public class UniqueBase
{
private static long counter_;
private readonly long _id;

private static long CreateId()
{
return System.Threading.Interlocked.Add(ref counter_, 1);
}

protected UniqueBase()
{
_id = CreateId();
}

public long ID
{
get { return _id;}
}
}

public sealed class Foo : UniqueBase
{
public override string ToString()
{
return ID.ToString();
}
}

Наследуешься от UniqueBase и при создании нового экземпляра будет гарантированно уникальное число (я думаю что диапазона long должно хватить).
Re: Как уникально идентифицировать объекты
От: madbinom  
Дата: 19.12.07 16:01
Оценка: +1
Здравствуйте, Аноним, Вы писали:

А>Есть некая система в которой есть группы некоторых объектов. Объекты внутри каждой группы должны уникально идентифицироваться (по крайней мере в пределах этой группы). Причем лучше (удобней и красивей) если это будет происходить автоматически, без участия пользователя этой системы.


А>Какие здесь возможны подходы?

А почему бы не использовать инкрементируещееся свойство?
class ID
{
Int64 id;//may be int32 or something else
public Int64 NewGuid{get{return id++;}}
}
Как уникально идентифицировать объекты
От: Аноним  
Дата: 17.12.07 12:47
Оценка:
Есть некая система в которой есть группы некоторых объектов. Объекты внутри каждой группы должны уникально идентифицироваться (по крайней мере в пределах этой группы). Причем лучше (удобней и красивей) если это будет происходить автоматически, без участия пользователя этой системы.

Пробовал такой подход:
public SomeObject()
{
...
   this.key = DataTime.Now.Ticks.ToString();
...
}


Но эта фишка, как оказалось, не делает того что нужно — при создании подря нескольких объектов, их поле key инициализируется один и тем же значением. Что, как упоминалось выше, неприемлемо.

Какие здесь возможны подходы?
Re[2]: Как уникально идентифицировать объекты
От: Аноним  
Дата: 17.12.07 12:59
Оценка:
Здравствуйте, Neco, Вы писали:

А>>Какие здесь возможны подходы?

N>GetHashCode()?

Но ведь его тоже надо как-то реализовывать. Среда AFAIK отнюдь не гарантирует уникальность значений по GetHashCode
Re[3]: Как уникально идентифицировать объекты
От: Аноним  
Дата: 17.12.07 13:13
Оценка:
Здравствуйте, Аноним, Вы писали:

А> Но ведь его тоже надо как-то реализовывать. Среда AFAIK отнюдь не гарантирует уникальность значений по GetHashCode


просто даже если и перекрыть GetHashCode() и возвращать какой-то намбер на основе полей объекта, то получится так что объекты с одинаковым контентом будут иметь одинкаовый хеш. А мне это в данном случае не надо.
Re[4]: Как уникально идентифицировать объекты
От: Neco  
Дата: 17.12.07 13:18
Оценка:
пардон
почитал насчёт gethashcode — не то, что я думал.

видимо меня всегда выручал тот же sequence
всю ночь не ем, весь день не сплю — устаю
Re[4]: Как уникально идентифицировать объекты
От: Аноним  
Дата: 17.12.07 13:19
Оценка:
Здравствуйте, Neco, Вы писали:

А>> Но ведь его тоже надо как-то реализовывать. Среда AFAIK отнюдь не гарантирует уникальность значений по GetHashCode

N>меня пока не подводила
N>я думаю, что GetHashCount базируется на тех же tick'ах, только к ним приплюсовывается к примеру адрес в памяти (я бы примерно так реализовал бы

опыты показывают, что дефолтговый GetHashCode генерит очень "хреново-уникальные-числа". Я точно не помню (пожтому могу слегка наврать), но на 100 объектов он генерит примерно 6 с одинаковым хешем (CLR 2.0)

это) — будет фактически уникально, мне кажется.
N>если хотите можете повысить уникальность через
N>
N>            object obj = new object();
N>            Random rnd = new Random(DateTime.Now.Millisecond);
N>            string uniq = obj.GetHashCode().ToString() + "|" + DateTime.Now.Ticks.ToString() + "|" + rnd.Next(int.MaxValue);
N>


N>а вообще уникального ничего нет — sequence у оракла тоже не бесконечен, но ведь пользуются и работает же


Объекты создаются с малым промежутком времени, поэтому Random rnd = new Random(DateTime.Now.Millisecond); здесь, увы, никак не поможет. тогда уж лучше seed вообще не задавать.
Re[2]: Как уникально идентифицировать объекты
От: Аноним  
Дата: 17.12.07 13:30
Оценка:
Здравствуйте, Kisloid, Вы писали:

K>Здравствуйте, <Аноним>, Вы писали:


А>>Есть некая система в которой есть группы некоторых объектов. Объекты внутри каждой группы должны уникально идентифицироваться (по крайней мере в пределах этой группы). Причем лучше (удобней и красивей) если это будет происходить автоматически, без участия пользователя этой системы.


K>Может так?

K>
K>private Guid guid = Guid.NewGuid();
K>


как-то жалко использовать гуиды)) ведь они и кончится могут ) Да и потом, вот попользую я их, станут они мне не нужными, а как назад их вернуть я не знаю(((

)))))

А если серьезно. Я это рассматриваю как вариант. Спасибо
Re[5]: Как уникально идентифицировать объекты
От: Neco  
Дата: 17.12.07 13:32
Оценка:
А>Объекты создаются с малым промежутком времени
куда уж меньше, чем в этом примере

        public void MegaTest() {
            for (int i = 0; i < 1000; i++) {
                TestUniq();
            }
        }
        public void TestUniq() {
            Dictionary<string, string> dict = new Dictionary<string, string>(1000);
            Random rnd = new Random(DateTime.Now.Millisecond);
            for (int i = 0; i < 1000; i++) {
                object obj = new object();
                string uniq = obj.GetHashCode().ToString() + "|" + DateTime.Now.Ticks.ToString() + "|" + rnd.Next(int.MaxValue);
                //System.Diagnostics.Debug.WriteLine(uniq);
                dict.Add(uniq, "");
            }
        }


и работает же.
всю ночь не ем, весь день не сплю — устаю
Re[2]: Как уникально идентифицировать объекты
От: Аноним  
Дата: 17.12.07 13:36
Оценка:
Здравствуйте, apps, Вы писали:

[]

A>Джеффри Рихтер "CLR via C#"[/q]


Я, ска, знал что что-то такое должно быть ))
Спасибо, камрад!
Re[6]: Как уникально идентифицировать объекты
От: Аноним  
Дата: 17.12.07 13:44
Оценка:
Здравствуйте, Neco, Вы писали:

А>>Объекты создаются с малым промежутком времени

N>куда уж меньше, чем в этом примере

[]

N>и работает же.


Почитай как работает Dictionary да и вообще HashTable. И тебе станет понятно, почему этот пример работает
Re[7]: Как уникально идентифицировать объекты
От: Neco  
Дата: 17.12.07 18:56
Оценка:
А>Почитай как работает Dictionary да и вообще HashTable. И тебе станет понятно, почему этот пример работает
Dictionary я использовал, чтобы проверить уникальность генерируемого значения.
Вы хотите оспорить уникальность ключа в словаре?
а можно аргументы, примеры?
всю ночь не ем, весь день не сплю — устаю
Re[2]: Как уникально идентифицировать объекты
От: lollipop  
Дата: 18.12.07 08:24
Оценка:
H>Можно сделать и так:


H>public class UniqueBase

H>{
H> private static long counter_;
H> private readonly long _id;

H> private static long CreateId()

H> {
H> return System.Threading.Interlocked.Add(ref counter_, 1);
H> }

H> protected UniqueBase()

H> {
H> _id = CreateId();
H> }

H> public long ID

H> {
H> get { return _id;}
H> }
H>}

H>public sealed class Foo : UniqueBase

H>{
H> public override string ToString()
H> {
H> return ID.ToString();
H> }
H>}

H>Наследуешься от UniqueBase и при создании нового экземпляра будет гарантированно уникальное число (я думаю что диапазона long должно хватить).


+1 .
Только из всего топика так и непонял есть же GUID может можно его использовать? Пусть генерится и сравнивается. Но зато уникальность какая
Re: Как уникально идентифицировать объекты
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 18.12.07 22:08
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Какие здесь возможны подходы?


Все зависит от того, зачем тебе это надо. Если только внутри программы, то сама ссылка на объект — вполне нормальный ключ. Если же планируется этот ключ куда то отдавать за пределы домена, то Guid в большинстве случаев оптимальное решение.
... << RSDN@Home 1.2.0 alpha rev. 725 on Windows Vista 6.0.6000.0>>
AVK Blog
Re[3]: Как уникально идентифицировать объекты
От: rgezikov Финляндия  
Дата: 19.12.07 08:44
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, apps, Вы писали:


А>[]


A>>Джеффри Рихтер "CLR via C#"[/q]


А>Я, ска, знал что что-то такое должно быть ))

А>Спасибо, камрад!

Дурилка картонная этот метод


    Dictionary<int, Object^>^ _crasher = gcnew Dictionary<int, Object^>();
    try
    {
        while(true)
        {
            Object^ obj = gcnew Object();
            int id = RuntimeHelpers::GetHashCode(obj);
            _crasher->Add(id, obj);

            if((_crasher->Count % 10000) == 0)
            {
                Console::WriteLine("Count: {0}", _crasher->Count);
            }
        }
    }
    catch(Exception^ e)
    {
        Console::WriteLine("Exception:\r\n{0}", e);
    }
    finally
    {
        Console::WriteLine("Count: {0}", _crasher->Count);
    }



Exception:
System.ArgumentException: An item with the same key has already been added.
   at System.ThrowHelper.ThrowArgumentException(ExceptionResource resource)
   at System.Collections.Generic.Dictionary`2.Insert(TKey key, TValue value, Boolean add)
   at System.Collections.Generic.Dictionary`2.Add(TKey key, TValue value)
   at main(String[] args) in c:\rgework\winapi\winapi.cpp:line 51
Count: 5321
Press any key to continue . . .


Такая уникальность нам не нужна! (С) не мой
Re[4]: Как уникально идентифицировать объекты
От: Mika Soukhov Stock#
Дата: 19.12.07 11:05
Оценка:
Здравствуйте, rgezikov, Вы писали:

R>Здравствуйте, Аноним, Вы писали:


А>>Здравствуйте, apps, Вы писали:


А>>[]


A>>>Джеффри Рихтер "CLR via C#"[/q]


А>>Я, ска, знал что что-то такое должно быть ))

А>>Спасибо, камрад!

R>Дурилка картонная этот метод


Управляемый указатель тем и отличется от не управляемого, что умеет отслеживать перемещения объекта при фрагментации памяти. Получили значение int-а нужно быть готовым к тому, что по этому самому значению области уравляемой памяти скоро появится другой объект.
Re[5]: Как уникально идентифицировать объекты
От: rgezikov Финляндия  
Дата: 19.12.07 11:09
Оценка:
Здравствуйте, Mika Soukhov, Вы писали:

MS>Здравствуйте, rgezikov, Вы писали:


R>>Здравствуйте, Аноним, Вы писали:


А>>>Здравствуйте, apps, Вы писали:


А>>>[]


A>>>>Джеффри Рихтер "CLR via C#"[/q]


А>>>Я, ска, знал что что-то такое должно быть ))

А>>>Спасибо, камрад!

R>>Дурилка картонная этот метод


MS>Управляемый указатель тем и отличется от не управляемого, что умеет отслеживать перемещения объекта при фрагментации памяти. Получили значение int-а нужно быть готовым к тому, что по этому самому значению области уравляемой памяти скоро появится другой объект.


А при чем тут управляемый указатель? Согласно описанию функция возвращает уникальный идентификатор для переданного ей объекта.
Re[3]: Как уникально идентифицировать объекты
От: rgezikov Финляндия  
Дата: 19.12.07 11:19
Оценка:
Здравствуйте, Mika Soukhov, Вы писали:

MS>Здравствуйте, apps, Вы писали:


A>>Здравствуйте, Аноним, Вы писали:


А>>>Но эта фишка, как оказалось, не делает того что нужно — при создании подря нескольких объектов, их поле key инициализируется один и тем же значением. Что, как упоминалось выше, неприемлемо.


А>>>Какие здесь возможны подходы?


A>>
A>>System.Runtime.CompilerServices.RuntimeHelpers.GetHashCode(obj);
A>>


MS>Этот метод лишь средство для получения невиртуального значения хеша. Для получения идентификаторов нужно использовать класс ObjectIDGenerator.


А вот эта штука работает хорошо. Большое спасибо, Михаил.

Еще подточить напильником, заделать thread safe singleton и будет прекрасный генератор идентификаторов.
Re[8]: Как уникально идентифицировать объекты
От: kstartsev Россия  
Дата: 19.12.07 11:30
Оценка:
Здравствуйте, Neco, Вы писали:

А>>Почитай как работает Dictionary да и вообще HashTable. И тебе станет понятно, почему этот пример работает

N>Dictionary я использовал, чтобы проверить уникальность генерируемого значения.
N>Вы хотите оспорить уникальность ключа в словаре?
N>а можно аргументы, примеры?

Давайте ситуацию: кладете в Dictionary пару ключ1 — значение1. Потом ключ2 — значение2. И если случается так, что хэш-код для каждого ключа сгенерился одинаковый, что будет в след. ситуациях:
1.

myDict[key1] = value1;
myDict[key2] = value2;

Console.WriteLine(string.Format("1: {0}; 2: {1}",myDict[key1], myDict[key2]));


2.
myDict.Add(key1, value1);
myDict.Add(key2, value2);

Console.WriteLine(string.Format("1: {0}; 2: {1}",myDict[key1], myDict[key2]));
Re[6]: Как уникально идентифицировать объекты
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 19.12.07 12:17
Оценка:
Здравствуйте, rgezikov, Вы писали:

R>А при чем тут управляемый указатель? Согласно описанию функция возвращает уникальный идентификатор для переданного ей объекта.


Согласно описанию

The default implementation of the GetHashCode method does not guarantee unique return values for different objects.

... << RSDN@Home 1.2.0 alpha rev. 725 on Windows Vista 6.0.6000.0>>
AVK Blog
Re[7]: Как уникально идентифицировать объекты
От: rgezikov Финляндия  
Дата: 19.12.07 15:15
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Здравствуйте, rgezikov, Вы писали:


R>>А при чем тут управляемый указатель? Согласно описанию функция возвращает уникальный идентификатор для переданного ей объекта.


AVK>Согласно описанию

AVK>

The default implementation of the GetHashCode method does not guarantee unique return values for different objects.


Вы, уважаемый, о методе GetHashCode какого класса говорите? Мы тут про класс RuntimeHelpers рассуждали. И вот в описании этого метода говорится следующее: Serves as a hash function for a particular type, suitable for use in hashing algorithms and data structures such as a hash table.
Re[8]: Как уникально идентифицировать объекты
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 19.12.07 18:46
Оценка:
Здравствуйте, rgezikov, Вы писали:

R>Вы, уважаемый, о методе GetHashCode какого класса говорите?


Я, уважаемый, говорю и о том и о другом.

R> Мы тут про класс RuntimeHelpers рассуждали. И вот в описании этого метода говорится следующее: Serves as a hash function for a particular type, suitable for use in hashing algorithms and data structures such as a hash table.


Цитировать нужно таки до конца:

The RuntimeHelpers.GetHashCode method always calls the Object.GetHashCode ...

... << RSDN@Home 1.2.0 alpha rev. 725 on Windows Vista 6.0.6000.0>>
AVK Blog
Re[9]: Как уникально идентифицировать объекты
От: kstartsev Россия  
Дата: 19.12.07 19:51
Оценка:
Здравствуйте, AndrewVK, Вы писали:

R>> Мы тут про класс RuntimeHelpers рассуждали. И вот в описании этого метода говорится следующее: Serves as a hash function for a particular type, suitable for use in hashing algorithms and data structures such as a hash table.


AVK>Цитировать нужно таки до конца:

AVK>

The RuntimeHelpers.GetHashCode method always calls the Object.GetHashCode ...


Справедливости ради, я бы хотел заметить, что если б в .NET была б нормальная реализация хэш-таблиц, то таких оговорок бы допускать не нужно было бы.
Re[4]: Как уникально идентифицировать объекты
От: Аноним  
Дата: 20.12.07 15:56
Оценка:
Здравствуйте, rgezikov, Вы писали:

R>Дурилка картонная этот метод



R>
R>    Dictionary<int, Object^>^ _crasher = gcnew Dictionary<int, Object^>();
R>    try
R>    {
R>        while(true)
R>        {
R>            Object^ obj = gcnew Object();
R>            int id = RuntimeHelpers::GetHashCode(obj);
R>            _crasher->Add(id, obj);

R>            if((_crasher->Count % 10000) == 0)
R>            {
R>                Console::WriteLine("Count: {0}", _crasher->Count);
R>            }
R>        }
R>    }
R>    catch(Exception^ e)
R>    {
R>        Console::WriteLine("Exception:\r\n{0}", e);
R>    }
R>    finally
R>    {
R>        Console::WriteLine("Count: {0}", _crasher->Count);
R>    }
R>



R>
R>Exception:
R>System.ArgumentException: An item with the same key has already been added.
R>   at System.ThrowHelper.ThrowArgumentException(ExceptionResource resource)
R>   at System.Collections.Generic.Dictionary`2.Insert(TKey key, TValue value, Boolean add)
R>   at System.Collections.Generic.Dictionary`2.Add(TKey key, TValue value)
R>   at main(String[] args) in c:\rgework\winapi\winapi.cpp:line 51
R>Count: 5321
R>Press any key to continue . . .
R>


R>Такая уникальность нам не нужна! (С) не мой


)) А ты
Object^ obj = gcnew Object();

вынеси за пределы while
А так — сборщик мусора позоду отрабатывает. Вот и "теряется" уникальность.
Re[9]: Как уникально идентифицировать объекты
От: Neco  
Дата: 21.12.07 04:22
Оценка:
А>>>Почитай как работает Dictionary да и вообще HashTable. И тебе станет понятно, почему этот пример работает
N>>Dictionary я использовал, чтобы проверить уникальность генерируемого значения.
N>>Вы хотите оспорить уникальность ключа в словаре?
N>>а можно аргументы, примеры?

K>Давайте ситуацию: кладете в Dictionary пару ключ1 — значение1. Потом ключ2 — значение2. И если случается так, что хэш-код для каждого ключа сгенерился одинаковый, что будет в след. ситуациях:

я понял ваш пример, но в своём тесте я не использовал запись вида dict[key1]=value (честно говоря недавно узнал о таком способе записи и до сих пор не могу понять зачем мне нужен метод "добавить если нету", если не для размножения скрытых ошибок — вы привели ещё один пример).
повторюсь, я воспользовался коллекцией, чтобы доказать, что за миллион проходов (а больше делать смысла не имело из-за tick'ов) повторений не произошло, поскольку считаю, что если бы хэш-коды (в вашем случае — в моём случае со string'ом там всё однозначнее) были бы одинаковые, то коллекция бы ругнулась при вставке (вызове Add).
всю ночь не ем, весь день не сплю — устаю
Re[10]: Как уникально идентифицировать объекты
От: Аноним  
Дата: 21.12.07 14:29
Оценка:
Здравствуйте, Neco, Вы писали:

N>повторюсь, я воспользовался коллекцией, чтобы доказать, что за миллион проходов (а больше делать смысла не имело из-за tick'ов) повторений не произошло, поскольку считаю, что если бы хэш-коды (в вашем случае — в моём случае со string'ом там всё однозначнее) были бы одинаковые, то коллекция бы ругнулась при вставке (вызове Add).


Уникальность была достигнута только потому что RuntimeHelpers.GetHashcode у тебя комбинируется с еще двумя значениями.
Re[2]: Как уникально идентифицировать объекты
От: knst Россия  
Дата: 22.12.07 01:11
Оценка:
Здравствуйте, madbinom, Вы писали:

M>Здравствуйте, Аноним, Вы писали:


А>>Есть некая система в которой есть группы некоторых объектов. Объекты внутри каждой группы должны уникально идентифицироваться (по крайней мере в пределах этой группы). Причем лучше (удобней и красивей) если это будет происходить автоматически, без участия пользователя этой системы.


А>>Какие здесь возможны подходы?

M>А почему бы не использовать инкрементируещееся свойство?
M>class ID
M>{
M>Int64 id;//may be int32 or something else
M>public Int64 NewGuid{get{return id++;}}
M>}

ага только лучче делать Interlocked.Increment чтоб потокобезопаснее было
и я бы сделал статик филд а не отдельный кклсаа , но это дело вкуса.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.