Сообщество программистов Autodesk в СНГ
Статьи => Опубликованные статьи => Тема начата: 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)
-
Не лучший способ хэширования.
В 2012 у AcDbObject был метод приведения типа к Adesk::UInt32, который и есть UINT. Видимо, в новой реализации этого метода нет или он к другому типу преобразовывает, который нельзя напрямую в UINT сохранить (сейчас нету свежего OARX, чтобы посмотреть реализацию).
В перегруженной функции хэширования предполагается, что адрес объекта совпадает с адресом дескриптора, а это может быть не так. ДАж если сейчас это так, то может измениться в последующих версиях. Возможно, там есть метод типа getOld (что-то такое было раньше), который возвращает указатель. И уже этот указатель нужно хэшировать. Именно сам указатель, а не данные, на которые он указывает, потому что он ни на что не указывает, а лишь хранит 32/64 бита информации. В приведённой функции отбрасываются 4 младших бита и 28 старших бит (реальный дескриптор 64 бита на х64 системе).ДУмаю, Лучше сперва ксорить старшие и младшие 32 бита, а уже потом удалять младшие 4 бита результата. На х86 разницы никакой точно не будет по сравнению с имеющейся функцией, на х64 могут быть различия (но я пока не встречал, чтобы в старшие 32 бита было записано что-то отличное от нуля).
-
Вообще-то речь идёт о AcDbHandle, а не о AcDbObject и даже не AcDbObjectId.
-
Я случайно описался, вместо AcDbObject следует читать AcDbHandle. Остальное остаётся в силе.
-
В 2012 у AcDbObject был метод приведения типа к Adesk::UInt32, который и есть UINT. Видимо, в новой реализации этого метода нет или он к другому типу преобразовывает, который нельзя напрямую в UINT сохранить (сейчас нету свежего OARX, чтобы посмотреть реализацию).
Есть и преобразовывает как и раньше. Плюс появился метод Adesk::UInt64. Делает тоже самое, что и делал раньше (в dbhandle.h эти методы явно описаны, т.к. они inline)
В перегруженной функции хэширования предполагается, что адрес объекта совпадает с адресом дескриптора, а это может быть не так.
Почему ты решил что тут идёт речь об адресе объекта? Код работает не с адресами, а со значениями.
Подумай во что "раскручивается" ((DWORD_PTR)key) в x86 и в x64, как это взаимосвязано с операторами Adesk::UInt32 и Adesk::UInt64.
-
Извиняюсь, был не внимателен. Почему-то причудилось, что key это указатель на объект, а не ссылка.
Но в х64 всё-равно отбрасываются старшие 32 бита из дескриптора. У меня они всегда были нолями, но я в документации не встречал упоминания об этом, так что может там и не нули встретиться могут... Хотя это без разницы, всё-равно конфликтов куча из-за удаления младших 4 бит, так что это я просто ступил. Можно все сообщения удалить.)