Mam następującą klasę Java
public class HelloWorld {
public static void main(String []args) {
}
}
Kiedy kompiluję ten plik i uruchamiam sha256 na wynikowym pliku klasy, otrzymuję
9c8d09e27ea78319ddb85fcf4f8085aa7762b0ab36dc5ba5fd000dccb63960ff HelloWorld.class
Następnie zmodyfikowałem klasę i dodałem pusty wiersz w następujący sposób:
public class HelloWorld {
public static void main(String []args) {
}
}
Znów uruchomiłem sha256 na wyjściu, spodziewając się tego samego rezultatu, ale zamiast tego dostałem
11f7ad3ad03eb9e0bb7bfa3b97bbe0f17d31194d8d92cc683cfbd7852e2d189f HelloWorld.class
Przeczytałem o tym artykule z TutorialsPoint, który:
Linia zawierająca tylko białe znaki, prawdopodobnie z komentarzem, jest znana jako pusta linia, a Java całkowicie ją ignoruje.
Moje pytanie brzmi: skoro Java ignoruje puste wiersze, dlaczego skompilowany kod bajtowy jest inny dla obu programów?
Mianowicie różnica, że HelloWorld.classw 0x03bajcie jest zastąpiony 0x04bajt.
Setz losową funkcją wewnętrzną, może generować inną kolejność przy każdym uruchomieniu. Może także dodać niestandardowy atrybut zawierający czas kompilacji. I tak dalej…