Каким образом вычислить уникальный хэш-код группы графических объектов в Autocad (типа для создания цифровой подписи)?
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Библиотека функций > Каким образом вычислить уникальный хэш-код группы графических объектов в Autocad (типа для создания цифровой подписи)?

Каким образом вычислить уникальный хэш-код группы графических объектов в Autocad (типа для создания цифровой подписи)?

Ответ
Поиск в этой теме
Непрочитано 14.03.2024, 09:36 #1
Каким образом вычислить уникальный хэш-код группы графических объектов в Autocad (типа для создания цифровой подписи)?
nickname2019
 
Регистрация: 18.11.2019
Сообщений: 1,704

Я думаю, у многих иногда возникает вопрос о актуальности версии какого-то разработанного ранее чертежа. Если это pdf - можно просто оценить дату и время. Но иногда возникает необходимость сравнить различные версии чертежа, выполненного в dwg. Поэтому возникает идея для каждой версии чертежа вычислять некоторый уникальный хэш-код, чтобы иметь возможность сравнивать не все объекты на чертеже, а хэш-коды.
Указанная задача более-менее решена для текстовых документов, но я не видел решения для чертежей.
Отсюда вопрос - каким конкретно образом вычислять хэш-коды для чертежей, чтобы коды обладали уникальностью и можно было сравнивать хэш-коды чертежей, а не сравнивать каждый объект из одного чертежа с аналогичным объектом из другого чертежа?
Просмотров: 2075
 
Непрочитано 14.03.2024, 10:05
#2
kp+

идущий по граблям
 
Регистрация: 26.05.2005
Сообщений: 5,153


Ну как... Entnext от забора до упора или цикл по выбранным объектам, Entget по каждому объекту, LM:lst->str (или другой подобный вариант), а дальше все то же, что и для текстового документа средствами какой-нибудь стандартной библиотеки (должна ж быть такая). Вычисленный хеш хранить в польз. свойствах документа, чтоб на него могли ориентироваться всякие файл-менеджеры
Честно говоря, не уверен, что будет корректно работать
Возможно, надо исключить группы 0 с ename, т.к. они меняются в каждом сеансе, и ориентироваться только на handle

Последний раз редактировалось kp+, 14.03.2024 в 10:34.
kp+ вне форума  
 
Автор темы   Непрочитано 14.03.2024, 10:36
#3
nickname2019


 
Регистрация: 18.11.2019
Сообщений: 1,704


Цитата:
Сообщение от kp+ Посмотреть сообщение
Ну как... Entnext от забора до упора, Entget по каждому объекту, LM:lst->str (или другой подобный вариант), а дальше все то же, что и для текстового документа. Вычисленный хеш хранить в польз. свойствах документа, чтоб на него могли ориентироваться всякие файл-менеджеры
Честно говоря, не уверен, что будет корректно работать
Возможно, надо исключить группы 0 с ename, т.к. они меняются в каждом сеансе, и ориентироваться только на handle
Спасибо. Но, думаю, что это не пойдет, так как зависит от абсолютных координат объектов в модели.
Если я все объекты передвину в сторону в модели, содержательная часть чертежа не изменится, а хэш-код - изменится.

Хотелось бы придумать алгоритм, который бы позволял сравнивать хэш-коды с учетом именно "содержательной части", которая определяет смысл.

Также не ясно, нужно ли учитывать порядок следования объектов в базе. Наверное, нужно.

Последний раз редактировалось nickname2019, 14.03.2024 в 10:44.
nickname2019 вне форума  
 
Непрочитано 14.03.2024, 10:58
#4
kp+

идущий по граблям
 
Регистрация: 26.05.2005
Сообщений: 5,153


Цитата:
Сообщение от nickname2019 Посмотреть сообщение
Хотелось бы придумать алгоритм, который бы позволял сравнивать хэш-коды с учетом именно "содержательной части", которая определяет смысл.
Именно для этих целей придумали chatgpt и прочие ИИ.


Цитата:
Сообщение от nickname2019 Посмотреть сообщение
Если я все объекты передвину в сторону в модели, содержательная часть чертежа не изменится, а хэш-код - изменится.
А вы представьте себе, что у вас генплан в координатах, который низзя двигать и не двигайте.
kp+ вне форума  
 
Автор темы   Непрочитано 14.03.2024, 11:04
#5
nickname2019


 
Регистрация: 18.11.2019
Сообщений: 1,704


Цитата:
Сообщение от kp+ Посмотреть сообщение
Именно для этих целей придумали chatgpt и прочие ИИ.
У них недостаточная степень достоверности.
Цитата:
Сообщение от kp+ Посмотреть сообщение
А вы представьте себе, что у вас генплан в координатах, который низзя двигать и не двигайте.
Если придумать универсальный алгоритм, он сможет сравнивать как генпланы (которые нельзя двигать), так и рабоче чертежи (которые по модели могут туда-сюда мотаться и из файла в файл).
Не хотелось бы сразу накладывать ограничения на алгоритм.
nickname2019 вне форума  
 
Непрочитано 14.03.2024, 11:34
| 1 #6
trir


 
Регистрация: 18.12.2010
Сообщений: 5,101


какая разница - файл есть файл, бери хеш и всё
trir вне форума  
 
Автор темы   Непрочитано 14.03.2024, 11:39
#7
nickname2019


 
Регистрация: 18.11.2019
Сообщений: 1,704


Цитата:
Сообщение от trir Посмотреть сообщение
какая разница - файл есть файл, бери хеш и всё
А каким методом лучше считать хэш для длинной текстовой строки?
Можно попробовать найти левую нижнюю точку рассматриваемых объектов, передвинуть их так, чтобы она попала в ноль, сделать строку по объектам и посчитать хэш. Тогда хэш будет зависеть от взаимного положения объектов, что и нужно. Для гепланов тоже работать будет.
Проблема будет с блоками и внешними ссылками, для них нужно отдельно считать хэши, а уровень вложенности этих объектов может быть огромным :-(.
nickname2019 вне форума  
 
Непрочитано 14.03.2024, 11:42
#8
trir


 
Регистрация: 18.12.2010
Сообщений: 5,101


Цитата:
А каким методом лучше считать хэш для длинной текстовой строки?
любым https://ru.wikipedia.org/wiki/%D0%9A..._MD_%D0%B8_SHA
trir вне форума  
 
Непрочитано 14.03.2024, 11:45
#9
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


Цитата:
Сообщение от nickname2019 Посмотреть сообщение
для каждой версии чертежа вычислять некоторый уникальный хэш-код, чтобы иметь возможность сравнивать не все объекты на чертеже, а хэш-коды.
это две разные задачи - обеспечить контроль версии файла или обеспечить контроль неизменности примитивов.
Цитата:
Сообщение от nickname2019 Посмотреть сообщение
некоторый уникальный хэш-код, чтобы иметь возможность сравнивать не все объекты на чертеже, а хэш-коды.
огорчу сразу - придется все равно хэши считать объектов, любая проверка по хэшу подразумевает высчитывание актуального хэша состояния объекта и сравнение с сохраненным ранее каким-то способом значением хэша.
Сергей812 вне форума  
 
Непрочитано 14.03.2024, 12:15
#10
kp+

идущий по граблям
 
Регистрация: 26.05.2005
Сообщений: 5,153


Может, воспользоваться стандартным сервисом добавления эцп к dwg?
https://help.autodesk.com/view/ACD/2...C-B9B95D6C6F39
Конечно, эта штука не отличит изменений по сути даже от панорамирования-зумирования, но уже что-то. Если подпись есть - значит файл точно не менялся
kp+ вне форума  
 
Автор темы   Непрочитано 14.03.2024, 12:50
#11
nickname2019


 
Регистрация: 18.11.2019
Сообщений: 1,704


Цитата:
Сообщение от kp+ Посмотреть сообщение
Может, воспользоваться стандартным сервисом добавления эцп к dwg?
https://help.autodesk.com/view/ACD/2...C-B9B95D6C6F39
Конечно, эта штука не отличит изменений по сути даже от панорамирования-зумирования, но уже что-то. Если подпись есть - значит файл точно не менялся
Хэш файла посчитать дело нехитрое. Интересно сделать сравнение группы графических объектов (не всего файла).

----- добавлено через ~2 мин. -----
Цитата:
Сообщение от Сергей812 Посмотреть сообщение
огорчу сразу - придется все равно хэши считать объектов, любая проверка по хэшу подразумевает высчитывание актуального хэша состояния объекта и сравнение с сохраненным ранее каким-то способом значением хэша.
Да. Куда этот хэш сохранять - отдельный вопрос. Но, имхо, это более прогрессивный контроль версий, чем Измы писать в штампах.
nickname2019 вне форума  
 
Непрочитано 14.03.2024, 14:08
#12
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


ну теоретически можно посчитать хеши примитивов - в лоб (псевдокод на .net):

Код:
[Выделить все]
 
byte[] lHash = null
using(%Поставщик криптографической услуги расчета хэша из .Net Framework%)
{
   using(MemoryStream lMS = new MemoryStream)
   {
        using(BinaryWriter lBW = new BinaryWriter(lMS, %Кодировка%)
        {
              %Записываются в поток lMS  через методы lBW в определенном порядке значения свойств примитива, выбранных в качестве опорных компонентов хэша%
        }
        lHash = %Поставщик криптографии%.ComputeHash(lMS.ToArray())
   }
}
насколько это будет работать в акаде с теми же вещественными числами с плавающей запятой - фиг знает, не экспериментировал)

Цитата:
Сообщение от nickname2019 Посмотреть сообщение
Но, имхо, это более прогрессивный контроль версий, чем Измы писать в штампах.
Ну для этого и вводится документооборот, когда доступ и контроль документов не сисадмином определяется на сервере файлопомойки - а индивидуально для каждого документа.
Сергей812 вне форума  
 
Автор темы   Непрочитано 14.03.2024, 14:15
#13
nickname2019


 
Регистрация: 18.11.2019
Сообщений: 1,704


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
ну теоретически можно посчитать хеши примитивов - в лоб (псевдокод на .net): Ну для этого и вводится документооборот, когда доступ и контроль документов не сисадмином определяется на сервере файлопомойки - а индивидуально для каждого документа.
Видимо надо формировать resbuf со всемм полями, потом суммировать в одну строку, потом считать SHA (результат - тоже строка). Строка будет большая. Экспериментировать надо.

Upd. Подумал я подумал - так не выйдет, так как за счет округлений координаты от перемещения объектов туда-сюда будут немного отличаться. Т.е. просто данные объекта нельзя в строку отправить, координаты придется как-то округлять. Пичалька .

Последний раз редактировалось nickname2019, 14.03.2024 в 14:26.
nickname2019 вне форума  
 
Непрочитано 14.03.2024, 14:38
#14
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


Цитата:
Сообщение от nickname2019 Посмотреть сообщение
Видимо надо формировать resbuf со всемм полями, потом суммировать в одну строку,
ну если есть излишки машинных ресурсов)

Цитата:
Сообщение от nickname2019 Посмотреть сообщение
так как за счет округлений координаты от перемещения объектов туда-сюда будут немного отличаться. Т.е. просто данные объекта нельзя в строку отправить, координаты придется как-то округлять.
ну там вообще все грустнее
Цитата:
Сообщение от Сергей812 Посмотреть сообщение
с теми же вещественными числами с плавающей запятой
из-за аппроксимации степенями двойки фактически равные координаты в бинарном представлении могут отличаться на один-два бита - и всё, новый хэш уже.
Сергей812 вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Библиотека функций > Каким образом вычислить уникальный хэш-код группы графических объектов в Autocad (типа для создания цифровой подписи)?



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
LISP. Плагин сборки в чертёж отмеченных областей из других файлов чертежей, с разбивкой объектов MagiCAD и SPDS. Протестировано в AutoCAD 2015, 2018 MagiCAD2016 в AutoCAD 2015 petro_f Готовые программы 20 28.07.2020 14:21
При завершении копирования (copy) нескольких выделенных объектов, исходный остается активным. AutoCAD 2017. OlegPVQ AutoCAD 13 15.11.2018 01:59
AutoCAD 2011 проблема с выделением 3д объектов dark_mike AutoCAD 7 20.08.2010 15:13
Проблема при вставке объектов из autocad в Word vova_king AutoCAD 4 06.08.2010 18:03