fn hex_encode<T: AsRef<[u8]>>(data: T) -> String
this function exists so that we do not need to pull in the crate hex. it is only used by md5 function below