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.class
w 0x03
bajcie jest zastąpiony 0x04
bajt.
Set
z 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…