Until the bug is fixed, you might want to consider a small change in how you use the "md5_hex" function. There are a variety of ways to do this, depending on your preference, but they would all boil down to something like:
my $md5 = md5_hex( encode( 'utf8', $string ));
(update: the right function to use here is "encode", not "decode" as originally posted -- sorry for the confusion)
That will pass a copy of the original string to md5_hex, and the copy will have the utf8 flag already turned off.
(update: probably the best way to do this is to write your own "wrapper" module for Digest::MD5 -- the functions in "MyMD5.pm" would check the string being passed in, and only de encode() if the utf8 flag is on. Then you just need to change the module name in the scripts that run md5 on ut8 strings.)