Совет по миграции: ACAD2011\12 в 13\14\15

Автор Тема: Совет по миграции: ACAD2011\12 в 13\14\15  (Прочитано 5088 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн ADSKАвтор темы

  • Administrator
  • Сообщений: 0
  • Карма: 2
« Последнее редактирование: 15-12-2014, 11:07:32 от Александр Ривилис »

Оффлайн Glam Troll

  • ADN Club
  • Сообщений: 17
  • Карма: 0
Re: Совет по миграции: ACAD2011\12 в 13\14\15
« Ответ #1 : 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 бита было записано что-то отличное от нуля).

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Совет по миграции: ACAD2011\12 в 13\14\15
« Ответ #2 : 05-01-2015, 12:08:24 »
Вообще-то речь идёт о AcDbHandle, а не о AcDbObject и даже не AcDbObjectId.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Glam Troll

  • ADN Club
  • Сообщений: 17
  • Карма: 0
Re: Совет по миграции: ACAD2011\12 в 13\14\15
« Ответ #3 : 05-01-2015, 12:47:21 »
Я случайно описался, вместо AcDbObject следует читать AcDbHandle. Остальное остаётся в силе.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Совет по миграции: ACAD2011\12 в 13\14\15
« Ответ #4 : 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.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Glam Troll

  • ADN Club
  • Сообщений: 17
  • Карма: 0
Re: Совет по миграции: ACAD2011\12 в 13\14\15
« Ответ #5 : 06-01-2015, 07:12:45 »
Извиняюсь, был не внимателен. Почему-то причудилось, что key это указатель на объект, а не ссылка.
Но в х64 всё-равно отбрасываются старшие 32 бита из дескриптора. У меня они всегда были нолями, но я в документации не встречал упоминания об этом, так что может там и не нули встретиться могут... Хотя это без разницы, всё-равно конфликтов куча из-за удаления младших 4 бит, так что это я просто ступил. Можно все сообщения удалить.)