compile Fingerprint only once
fix implicit casts
remove unneeded member variable
replace shared_ptr instances to make intent of single owner more obvious
fix implicit type conversios