Сообщество программистов Autodesk в СНГ

Статьи => Опубликованные статьи => Тема начата: ADSK от 15-12-2014, 04:30:06

Название: Совет по миграции: ACAD2011\12 в 13\14\15
Отправлено: ADSK от 15-12-2014, 04:30:06
Совет по миграции: ACAD2011\12 в 13\14\15 (http://adn-cis.org/sovet-po-migraczii-acad2011-12-v-13-14-15.html)
Название: Re: Совет по миграции: ACAD2011\12 в 13\14\15
Отправлено: Glam Troll от 05-01-2015, 08:35:03
Не лучший способ хэширования.
В 2012 у AcDbObject был метод приведения типа к Adesk::UInt32, который и есть UINT. Видимо, в новой реализации этого метода нет или он к другому типу преобразовывает, который нельзя напрямую в UINT  сохранить (сейчас нету свежего OARX,  чтобы посмотреть реализацию).
В перегруженной функции хэширования предполагается, что адрес объекта совпадает с адресом дескриптора, а это может быть не так. ДАж если сейчас это так, то может измениться в последующих версиях. Возможно, там есть метод типа getOld (что-то такое было раньше), который возвращает указатель. И уже этот указатель нужно хэшировать.  Именно сам указатель, а не данные, на которые он указывает, потому что он ни на что не указывает, а лишь хранит 32/64 бита информации. В приведённой функции отбрасываются 4 младших бита и 28 старших бит (реальный дескриптор 64 бита на х64 системе).ДУмаю, Лучше сперва ксорить старшие и младшие 32 бита, а уже потом удалять младшие 4 бита результата. На х86 разницы никакой точно не будет по сравнению с имеющейся функцией, на х64 могут быть различия (но я пока не встречал, чтобы в старшие 32 бита было записано что-то отличное от нуля).
Название: Re: Совет по миграции: ACAD2011\12 в 13\14\15
Отправлено: Александр Ривилис от 05-01-2015, 12:08:24
Вообще-то речь идёт о AcDbHandle, а не о AcDbObject и даже не AcDbObjectId.
Название: Re: Совет по миграции: ACAD2011\12 в 13\14\15
Отправлено: Glam Troll от 05-01-2015, 12:47:21
Я случайно описался, вместо AcDbObject следует читать AcDbHandle. Остальное остаётся в силе.
Название: Re: Совет по миграции: ACAD2011\12 в 13\14\15
Отправлено: Александр Ривилис от 05-01-2015, 21:26:26
В 2012 у AcDbObject был метод приведения типа к Adesk::UInt32, который и есть UINT. Видимо, в новой реализации этого метода нет или он к другому типу преобразовывает, который нельзя напрямую в UINT  сохранить (сейчас нету свежего OARX,  чтобы посмотреть реализацию).
Есть и преобразовывает как и раньше. Плюс появился метод Adesk::UInt64. Делает тоже самое, что и делал раньше (в dbhandle.h эти методы явно описаны, т.к. они inline)

В перегруженной функции хэширования предполагается, что адрес объекта совпадает с адресом дескриптора, а это может быть не так.
Почему ты решил что тут идёт речь об адресе объекта? Код работает не с адресами, а со значениями.
Подумай во что "раскручивается" ((DWORD_PTR)key) в x86 и в x64, как это взаимосвязано с операторами Adesk::UInt32 и Adesk::UInt64.
Название: Re: Совет по миграции: ACAD2011\12 в 13\14\15
Отправлено: Glam Troll от 06-01-2015, 07:12:45
Извиняюсь, был не внимателен. Почему-то причудилось, что key это указатель на объект, а не ссылка.
Но в х64 всё-равно отбрасываются старшие 32 бита из дескриптора. У меня они всегда были нолями, но я в документации не встречал упоминания об этом, так что может там и не нули встретиться могут... Хотя это без разницы, всё-равно конфликтов куча из-за удаления младших 4 бит, так что это я просто ступил. Можно все сообщения удалить.)