rsync -nacv <source> <destination> will output a list of files that are different. As usual with
rsync the source and destination can be local or remote.
-n option does a dry run and doesn't actually transfer any files.
-a option recursively checks every file and directory below the path you specify.
-c option does a checksum of every file. (The default uses timestamps and sizes instead.) The checksum used is MD5 for newer versions of rsync and MD4 for older versions.
-v option prints out the results.
As far as efficiency is concerned, each file needs to be completely read from the disk, the hash calculated and transferred to the destination, then the destination file read in from the disk and the hash calculated, and finally the two hashes compared... for every file. This is true of any method by any software.
The network transfer could be improved if you expect most of the files to be the same by combining more files into a single hash. The network is unlikely to be the bottleneck anyway since it only has hashes traveling across it.
rsync runs with multiple threads at both ends, so your disks should be fully utilised the whole time unless you end up CPU-bound, in which case your CPU(s) will be fully utilised.