Для модификации загруженного байткода есть интерфейс java.lang.instrument.Instrumentation.
Но его функциональность ограничена, можно лишь изменять тела существующих методов, новые методы или поля через этот механизм добавить не получится.
Дальше идёт ссылка на запись в constant pool, где хранится имя текущего класса (интересно зачем, ведь оно по текущему пути легко определяется...)
Ложки не существует, Нео!
Класс можно опредлить вызовом ClassLoader::defineClass() и никакого «текущего пути» у него не будет, а имя будет-таки. Такие классы многократно создаются за время работы программы, те же лямбды, к примеру.
Эдак и до вопроса «почему локальная переменная типа long занимает 2 слота памяти, а ссылка на объект даже на 64-битной системе с -XX:-UseCompressedOops — один» дойти можно.
public int hashCode() {
int h = 0;
int off = offset;
char val[] = value;
int len = count;
if (len < 16) {
for (int i = len ; i > 0; i--) {
h = (h * 37) + val[off++];
}
} else {
// only sample some characters
int skip = len / 8;
for (int i = len ; i > 0; i -= skip, off += skip) {
h = (h * 39) + val[off];
}
}
return h;
}
Она была медленнее, коллизии для неё подобрать было ещё легче, для строк длиннее 15 символов учитывался лишь каждый S.length() / 8 символ, да ещё и в Java Language Specification была ошибка.
Потом это обнаружили и Джош Блох предложил всё переделать, детали в JDK-4045622.
Откуда взялся коэффициент 31, и почему решили считать именно так?
Приведу несколько цитат из вышеупомянутого issue:
The class of hash function that I recommend using is polynomials whose
coefficients are the characters in the string:
The value of x is part of the definition of the hash function; choosing
this value is somewhat of a black art.
While this class of hash function is recommended in The Dragon Book
(P(65599)) and Kernighan and Ritchie's «The C Programming Language, 2 Ed.»
(P(31)), it is not attributed in either of these books.
I went so far as to call up Dennis Ritchie, who said that he did not know where the hash function came from. He walked across the hall and asked Brian Kernighan, who also had no recollection.
I'd probably select P(31), as it's the cheapest to calculate on a RISC machine (because 31 is the difference of two powers of two).
Откуда взялось 31 не помнят даже Керниган и Ричи. Чёрная магия, как она есть.
Если тема интересна, то стоит прочитать все комментарии к JDK-4045622 по ссылке выше.
Эти строки и не могли подойти, в .net используется другой алгоритм хеширования. Плюс, насколько я вижу из исходного кода, предпринимаются попытки рандомизации.
Но так как хеширование в общем случае это отображение бОльшего множества на меньшее, то коллизии по хеш-коду между различными строками будут и в .net.
Вообще, суть работы в том, что впервые на собаках попробовали подвид технологии CRISPR/Cas9 — Prime Editing (PE), которая не делает двухцепочечных разрывов ДНК, а значит, существенно снижает возможность ошибок оффтаргета и генетических нарушений. Про эту технологию я узнал впервые. Но все кругом как слабоумные повторяют только "Ыыыыы щеночки свееетятся".
Нет, брат, с таким настроением ты слона не продашь!
мучая детей и заставляя их писать ручкой на бумажке
Ах, бедные-несчастные снежинки!
Их заставляют сжимать нежными, привыкшими к шелковистому тачскрину, пальчиками эти ужасные орудия пыток, шариковые ручки и грифельные карандаши. И, о ужас, водить ими по грубой, архаичной целлюлозе!!11!!один!
Важно осознавать, что жизнь коротка, а смерть неизбежна.
Из социально-значимого ойтишнег может поучаствовать лишь в создании чего-то со знаком «минус». Системы слежения, распознания лиц, высокотехнологичные вооружения (но это не точно), безналичные платежи, «социальный капитал». Всё то, чему нацистские преступники аплодируют из могил.
Для модификации загруженного байткода есть интерфейс java.lang.instrument.Instrumentation.
Но его функциональность ограничена, можно лишь изменять тела существующих методов, новые методы или поля через этот механизм добавить не получится.
Один из примеров применения: https://habr.com/ru/company/odnoklassniki/blog/429040/
Нормальный человек — он как истинный шотландец.
Безупречен во всех отношениях, но в природе, увы, не встречается.
Экий вы впечатлительный.
В детстве я читал «Большую Медицинскую Энциклопедию» с красочными иллюстрациями. Не думаю, что проктологи с гинекологами сумеют меня удивить.
Ложки не существует, Нео!
Класс можно опредлить вызовом ClassLoader::defineClass() и никакого «текущего пути» у него не будет, а имя будет-таки. Такие классы многократно создаются за время работы программы, те же лямбды, к примеру.
У стоматологов обычно интересные картинки в тему. Кровь-кишки-расчленёнка, всё как мы любим.
А почему рядом с инстаграмом в заголовке звёздочка есть, а рядом с госдумой нет?
Если на целевой платформе нет инструкций работы с 32-битными целыми, то их придётся эмулировать серией других инструкций, а это будет медленнее.
В Java тип
charс самого начала был 16-битным, а алгоритм хеширования позаимствовали из Kernighan and Ritchie's «The C Programming Language, 2 Ed.»В другом комментарии я дал ссылку на issue с объясненияи автора реализации.
Эдак и до вопроса «почему локальная переменная типа long занимает 2 слота памяти, а ссылка на объект даже на 64-битной системе с
-XX:-UseCompressedOops— один» дойти можно.До Java 1.2 хеш-функция строки была другой:
Она была медленнее, коллизии для неё подобрать было ещё легче, для строк длиннее 15 символов учитывался лишь каждый
S.length() / 8символ, да ещё и в Java Language Specification была ошибка.Потом это обнаружили и Джош Блох предложил всё переделать, детали в JDK-4045622.
Приведу несколько цитат из вышеупомянутого issue:
Откуда взялось 31 не помнят даже Керниган и Ричи. Чёрная магия, как она есть.
Если тема интересна, то стоит прочитать все комментарии к JDK-4045622 по ссылке выше.
Но так как хеширование в общем случае это отображение бОльшего множества на меньшее, то коллизии по хеш-коду между различными строками будут и в .net.
«При проведении ЭКО в нашей клинике гены светлячков для ваших деток в подарок!»
Нет, брат, с таким настроением ты слона не продашь!
Ах, бедные-несчастные снежинки!
Их заставляют сжимать нежными, привыкшими к шелковистому тачскрину, пальчиками эти ужасные орудия пыток, шариковые ручки и грифельные карандаши. И, о ужас, водить ими по грубой, архаичной целлюлозе!!11!!один!
Твиттор чуть более чем полностью состоит из ботов. Для человечества будет большим благом, если эта помойка перестанет существовать. Маску удачи.
Пармезан, хамон, французские вина?
Важно осознавать, что жизнь коротка, а смерть неизбежна.
Из социально-значимого ойтишнег может поучаствовать лишь в создании чего-то со знаком «минус». Системы слежения, распознания лиц, высокотехнологичные вооружения (но это не точно), безналичные платежи, «социальный капитал». Всё то, чему нацистские преступники аплодируют из могил.