Гость
Map
Форумы / Java [игнор отключен] [закрыт для гостей] / Как посчитать хеш класса ? / 25 сообщений из 72, страница 1 из 3
26.02.2021, 11:59
    #40048887
questioner
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как посчитать хеш класса ?
Нужна штука, которая будет трекать изменения в классе и в любом его поле на любую глубину

Ну то есть я скармливаю ей MyClass.class, эта штука выдаёт мне некую хеш строку. Потом где-то кто-то добавил новое поле в MyOtherClass и хеш строка должна поменяться.

Код: java
1.
2.
3.
4.
5.
6.
public class MyClass{
    int field1;
    List<MyOtherClass> otherClassList = ...;
    ...
 
}



Можно конечно самому написать через рефлекшн, но может есть что-то готовое уже?
...
Рейтинг: 0 / 0
26.02.2021, 12:57
    #40048911
crutchmaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как посчитать хеш класса ?
questioner
эта штука выдаёт мне некую хеш строку. Потом где-то кто-то добавил новое поле в MyOtherClass и хеш строка должна поменяться.

Строки иммутабельные и не являются ссылками.
Код: java
1.
2.
3.
4.
String s = "abc";
String s1 = s;
s = "ab";
System.out.println(s1); //--> abc


Идея изначально провальная, давай заново.
...
Рейтинг: 0 / 0
26.02.2021, 13:01
    #40048915
crutchmaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как посчитать хеш класса ?
questioner
отом где-то кто-то добавил новое поле в MyOtherClass

Разве поля не определяются на этапе компиляции? Если ты хочешь добавлять их в рантайме, то тебе не нужна java, возьми какой-нибудь динамический [недо]язычок. Вон, на js, по идее, можно такое провернуть через прокси и какой-нибудь объект с иерархией.
...
Рейтинг: 0 / 0
26.02.2021, 13:08
    #40048920
questioner
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как посчитать хеш класса ?
crutchmaster,

я и не собирался добавлять поля в рантайме. С чего ты взял?


Программист Вася добавил некое поле в некий класс , закоммитил. Надо его предупредить, что он может сломать другой сервис. Нужно явно его заставить проверить, что он не сломает ничего.
...
Рейтинг: 0 / 0
26.02.2021, 13:10
    #40048922
questioner
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как посчитать хеш класса ?
речь идёт о чем то типа java.io.ObjectStreamClass#computeDefaultSUID
...
Рейтинг: 0 / 0
26.02.2021, 13:14
    #40048924
crutchmaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как посчитать хеш класса ?
questioner
я и не собирался добавлять поля в рантайме. С чего ты взял?

С того, что ты написал:

questioner
Потом где-то кто-то добавил новое поле

>новое поле
>поле
>добавил

questioner
Программист Вася добавил некое поле в некий класс , закоммитил. Надо его предупредить, что он может сломать другой сервис.

Так для такого есть интерфейсы. Если Васян что-то где-то ломает у него рассыпется проект при сборке.
Да и как он может что-то сломать, если расширяет класс.
...
Рейтинг: 0 / 0
26.02.2021, 13:15
    #40048925
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как посчитать хеш класса ?
SerialVersion UUID .
Считает его утилита serialver (JDK) или метод класса ObjectStreamClass .
...
Рейтинг: 0 / 0
26.02.2021, 13:18
    #40048926
questioner
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как посчитать хеш класса ?
crutchmaster,

Вижу, есть проблемы с причинно следственной связью. Додумываешь слова. Про рантайм от меня вообще речи не было
...
Рейтинг: 0 / 0
26.02.2021, 13:18
    #40048927
Kachalov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как посчитать хеш класса ?
questioner
я скармливаю ей MyClass.class, эта штука выдаёт мне некую хеш строку. Потом где-то кто-то добавил новое поле в MyOtherClass и хеш строка должна поменяться.

Почему нельзя просто посчитать хэш класса?
Код: java
1.
2.
3.
4.
Class c = ...
String className = c.getName();
String classAsPath = className.replace('.', '/') + ".class";
InputStream stream = c.getClassLoader().getResourceAsStream(classAsPath);


(дисклаймер: код взял первый попавшийся со стековерфлоу - улучшайте сами)

Еще можно паковать в JAR с цифровой подписью и проверять ее
...
Рейтинг: 0 / 0
26.02.2021, 13:21
    #40048929
questioner
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как посчитать хеш класса ?
Basil A. Sidorov
SerialVersion UUID .
Считает его утилита serialver (JDK) или метод класса ObjectStreamClass .


Я это уже собственно и упомянул.

у меня есть пара вопросов:

1. Будет ли эта штука возвращать одно и то же число и на винде и на маке и на линуксе ?
2. Будет ли эта штука возвращать одно и то же число на java 8 9 10 11... ?
3. Я так понимаю она не учитывает изменение в поле MyOtherClass при подсчёте для MyClass, а надо, чтобы учитывала
...
Рейтинг: 0 / 0
26.02.2021, 13:30
    #40048932
questioner
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как посчитать хеш класса ?
Kachalov,

те же вопросы, что и постом выше.

Можно ссылку на тред на SO ? я видимо не смог сформулировать запрос так, чтобы найти
...
Рейтинг: 0 / 0
26.02.2021, 13:33
    #40048933
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как посчитать хеш класса ?
questioner,

А че не ответил?
авторТак для такого есть интерфейсы. Если Васян что-то где-то ломает у него рассыпется проект при сборке.
Да и как он может что-то сломать, если расширяет класс.
...
Рейтинг: 0 / 0
26.02.2021, 13:34
    #40048934
questioner
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как посчитать хеш класса ?
PetroNotC Sharp
questioner,

А че не ответил?
авторТак для такого есть интерфейсы. Если Васян что-то где-то ломает у него рассыпется проект при сборке.
Да и как он может что-то сломать, если расширяет класс.

Это оффтоп. Можем в другом топике обсудить, если есть желание
...
Рейтинг: 0 / 0
26.02.2021, 13:37
    #40048935
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как посчитать хеш класса ?
questioner,
Все многообразие ссылок на классы ты не учтешь.
Задача странная. Делай руками и уходи.
...
Рейтинг: 0 / 0
26.02.2021, 13:42
    #40048938
Kachalov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как посчитать хеш класса ?
questioner

те же вопросы, что и постом выше.

Можно ссылку на тред на SO ? я видимо не смог сформулировать запрос так, чтобы найти

- ссылку не дам (уже нет ее и пост не о том был). А по сути изменения в глубину без Reflection-а не отследишь (так мне кажется), а подсчет хэша класса по его байткоду будет давать другой хэш на любой чих (другая версия JDK, другие настройки компилятора - типа дебаг информации и т д). Готовой утилиты решающей Вашу задачу не знаю, но не исключаю что она кем то уже написана (мне и раньше, когда сталкивался с подобной задачей пришлось городить рефлекшн велосипед)
...
Рейтинг: 0 / 0
26.02.2021, 13:42
    #40048939
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как посчитать хеш класса ?
questioner
PetroNotC Sharp
questioner,

А че не ответил?
пропущено...

Это оффтоп. Можем в другом топике обсудить, если есть желание

Мне не надо. Я за версту чую странные желания осчастливить мир со словами НА ЛЮБУЮ и ЛЮБЫЕ
авторлюбом его поле на любую глубину
А если у тебя сериализация то там POJO классы.
...
Рейтинг: 0 / 0
26.02.2021, 13:52
    #40048945
questioner
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как посчитать хеш класса ?
Kachalov
questioner

те же вопросы, что и постом выше.

Можно ссылку на тред на SO ? я видимо не смог сформулировать запрос так, чтобы найти

- ссылку не дам (уже нет ее и пост не о том был). А по сути изменения в глубину без Reflection-а не отследишь (так мне кажется), а подсчет хэша класса по его байткоду будет давать другой хэш на любой чих (другая версия JDK, другие настройки компилятора - типа дебаг информации и т д). Готовой утилиты решающей Вашу задачу не знаю, но не исключаю что она кем то уже написана (мне и раньше, когда сталкивался с подобной задачей пришлось городить рефлекшн велосипед)


Вот я тоже думаю, что придётся писать ограниченный своими нуждами трёхколёсный лисопед. Надеялся, что кто-то написал уже полноценный байк)
...
Рейтинг: 0 / 0
26.02.2021, 13:53
    #40048946
questioner
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как посчитать хеш класса ?
PetroNotC Sharp,
Если тебе не надо, то к чему вопрос?
...
Рейтинг: 0 / 0
26.02.2021, 14:02
    #40048953
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как посчитать хеш класса ?
questioner
PetroNotC Sharp,
Если тебе не надо, то к чему вопрос?
проверить, вменяемый ли постановщик. Решаем ли задача без граничных условий.
Убедился)))
Тебе верно сказали. Твой маркер будет меняться на каждый чих.
...
Рейтинг: 0 / 0
26.02.2021, 14:03
    #40048956
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как посчитать хеш класса ?
questioner
Нужна штука, которая будет трекать изменения в классе и в любом его поле на любую глубину

Начинается пятница.

Во первых непонятно что значит "трекать" ? У вас-же не Lisp. А Java. Тоесть вы контролируете изменения по коду.
И в фазе компилляции знаете что у вас есть.

Во вторых зачем. Хеш таблицы? Контракт хеш-кода предполагает что и equals тоже участвует в этой-же формуле.
Вам придётся автоматически выводить предикат эквивалентности для таких объектов-мутантов. Это не всегда возможно.
Это требует обсуждений. Не все поля класса принадлежат DTO и есть технические поля которые вовсе не надо
включать в эту формулу. Кеширующие. Вычислимые. Transient. Внешние объекты. Файлы. Сокеты. Это все не сериализуемо
и не имеет представления в виде бинаря или строки. Тоесть посчитать хеш-код невозможно. Или вы посчитаете фигню.

Есть более выгодное IMHO. Если объекты иммутабельны и излекаются из БД - то уникальный ключ - уже полностью
указывает на равенство объектов с точки зрения бизнеса и на этом можно остановится. Это еще раз ИМХО.

По поводу рефлексии. Да писать самому лучше. Глубже разберешся. Но объект может представлять граф и наивный
алгоритм обхода вложенности теоретически может попасть в петлю. Надо это учитывать как маловероятный но все таки кейс.

По поводу готового. Посмотри на http://commons.apache.org/proper/commons-beanutils/ может пригодится. Это взгляд
на задачу с точки зрения бинов а не pure Java.
...
Рейтинг: 0 / 0
26.02.2021, 14:18
    #40048965
questioner
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как посчитать хеш класса ?
PetroNotC Sharp
questioner
PetroNotC Sharp,
Если тебе не надо, то к чему вопрос?
проверить, вменяемый ли постановщик. Решаем ли задача без граничных условий.
Убедился)))
Тебе верно сказали.


Зачем тебе это?
...
Рейтинг: 0 / 0
26.02.2021, 14:19
    #40048967
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как посчитать хеш класса ?
mayton,
+1
...
Рейтинг: 0 / 0
26.02.2021, 14:21
    #40048970
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как посчитать хеш класса ?
questioner
PetroNotC Sharp
пропущено...
проверить, вменяемый ли постановщик. Решаем ли задача без граничных условий.
Убедился)))
Тебе верно сказали.


Зачем тебе это?

Гимнастика ума. Развлечение. Проф рост для диагностики убыточных проектов.
Ещё?
...
Рейтинг: 0 / 0
26.02.2021, 14:23
    #40048971
questioner
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как посчитать хеш класса ?
mayton
questioner
Нужна штука, которая будет трекать изменения в классе и в любом его поле на любую глубину

Начинается пятница.

Во первых непонятно что значит "трекать" ? У вас-же не Lisp. А Java. Тоесть вы контролируете изменения по коду.
И в фазе компилляции знаете что у вас есть.

Во вторых зачем. Хеш таблицы? Контракт хеш-кода предполагает что и equals тоже участвует в этой-же формуле.
Вам придётся автоматически выводить предикат эквивалентности для таких объектов-мутантов. Это не всегда возможно.
Это требует обсуждений. Не все поля класса принадлежат DTO и есть технические поля которые вовсе не надо
включать в эту формулу. Кеширующие. Вычислимые. Transient. Внешние объекты. Файлы. Сокеты. Это все не сериализуемо
и не имеет представления в виде бинаря или строки. Тоесть посчитать хеш-код невозможно. Или вы посчитаете фигню.

Есть более выгодное IMHO. Если объекты иммутабельны и излекаются из БД - то уникальный ключ - уже полностью
указывает на равенство объектов с точки зрения бизнеса и на этом можно остановится. Это еще раз ИМХО.

По поводу рефлексии. Да писать самому лучше. Глубже разберешся. Но объект может представлять граф и наивный
алгоритм обхода вложенности теоретически может попасть в петлю. Надо это учитывать как маловероятный но все таки кейс.

По поводу готового. Посмотри на http://commons.apache.org/proper/commons-beanutils/ может пригодится. Это взгляд
на задачу с точки зрения бинов а не pure Java.


Согласен - мысли такие же...

По поводу "трекать":

Мы собираем некий объект и делаем его снепшот и сохраняем в некотором хранилище, чтобы юзер смог пвоторить своё действие из прошлого. В будущем некто может добавить в объект поля, а в хранилище будет сохраняться снепшот без этого поля, что может не хило так всё разломать.

Миграция исторических данных остаётся за скобками этого топика.
...
Рейтинг: 0 / 0
26.02.2021, 14:24
    #40048972
questioner
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как посчитать хеш класса ?
PetroNotC Sharp
questioner
пропущено...


Зачем тебе это?

Гимнастика ума. Развлечение. Проф рост для диагностики убыточных проектов.
Ещё?


Спорить не буду, но думаю это приведёт только к деградации. Извини, больше не буду отвечать на твои сообщения.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Как посчитать хеш класса ? / 25 сообщений из 72, страница 1 из 3
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]