How can I find (programmatically) which fields have been edited on a piece of content?
In the node form submit, you can call node_load($node-&gt;nid, NULL, TRUE) for Drupal to retrieve the original about-to-be-overwritten node, allowing you to walk the list of fields, and compare them.

I would use sha1sum(serialize($field)) to compare them, as that makes it easy to do regardless of field type.