To easily look for any significant change, you can just:
Id[] changedRecordIds = new Id[0];
for(Integer i = 0, s = Trigger.new.size(); i < s; i++) {
sObject oldRecord = Trigger.old[i].clone(true, false, false, false);
sObject newRecord = Trigger.new[i].clone(true, false, false, false);
if(oldRecord != newRecord) {
changedRecordIds.add(Trigger.new[i].id);
}
}
You can also restrict it to just specific fields by obtaining a list of field names, in order to filter out unwanted fields:
Set<String> allowlist = new Set<String>{ 'Name','Field1','Field2' };
Id[] changedRecordIds = new Id[0];
for(Integer i = 0, s = Trigger.new.size(); i < s; i++) {
Map<String, Object> oldRecordFields = Trigger.old[i].clone(true, false, false, false).getPopulatedFieldsAsMap();
Map<String, Object> newRecordFields = Trigger.new[i].clone(true, false, false, false).getPopulatedFieldsAsMap();
oldRecordFields.keySet().retainAll(allowlist);
newRecordFields.keySet().retainAll(allowlist);
if(oldRecordFields != newRecordFields) {
changedRecordIds.add(Trigger.new[i].id);
}
}
You could use a Field Set to specify the values, too, or you could make a removeList that uses removeAll to specifically exclude fields, if you prefer.