[Question]
  [
Create a program that prints the MD5 sum of its source in the form:
```
MD5 sum of my source is: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
```
No cheating - you can't just read the source file and compute its sum. The program must not read any external information.
Of course you can use a MD5 library available for your language.
  
[Answer]
## Python 2, 91 bytes
```
s="import md5;print'MD5 sum of my source is: '+md5.new('s=%r;exec s'%s).hexdigest()";exec s
```
Using the Python quine variant which doesn't require repeating everything twice. Tested on [ideone](http://ideone.com/XAoU9K).
[Answer]
## Python 157 149
```
r='r=%r;import md5;print "MD5 sum of my source is: "+md5.new(r%%r).hexdigest()';import md5;print "MD5 sum of my source is: "+md5.new(r%r).hexdigest()
```
### Output:
```
MD5 sum of my source is: bb74dfc895c13ab991c4336e75865426
```
Verification at [ideone](http://ideone.com/QKmFGW)
[Answer]
# Perl + Digest::MD5, 89 bytes
```
$_=q(use Digest::MD5 md5_hex;say"MD5 sum of my source is: ",md5_hex"\$_=q($_);eval");eval
```
No TIO link because Digest::MD5 is not installed on TIO. Note that this requires the language conformance level to be set to 5.10 or higher (`-M5.010`; this doesn't carry a byte penalty according to PPCG rules.
## Explanation
This is yet another "print a function of the source code" challenge, meaning that it can be trivially solved via a universal quine constructor.
### Universal quine constructor
```
$_=q(…"\$_=q($_);eval");eval
```
We use the `q()` string notation (which nests) to initialize `$_`, the "default" variable that Perl uses for missing arguments. Then we `eval` with a missing argument, so that the string inside the `q()` gets evaluated.
The string inside the `q()` is a description of how to create the entire program; we specify the rest of the program literally, then use an unescaped `$_` to substitute the whole string in for the inside.
The technique thus creates a string with identical contents to the entire program's source; we could print it to produce a quine. We can also do other things to it first, though, making a universal quine constructor.
### The rest of the program
```
use Digest::MD5 md5_hex;say"MD5 sum of my source is: ",md5_hex
```
Very simple: import an MD5 builtin, then print the fixed string specified in the question (it's not worth compressing it, I believe that in Perl the decompressor would take up more space than just stating the string literally), and use the MD5 builtin on the string we got via the universal quine constructor.
[Answer]
# Node.js REPL (version 0.9.3), ~~96~~ 94 bytes
Using the last version of Node.js that existed when this challenge was posted. I've tracked down the [November 9, 2012 documentation](https://github.com/nodejs/node/blob/f3621359f4866c8ed732a48ece4049cc6e9a8b91/doc/api/crypto.markdown) for Node.js' crypto module, and it did support all the functions I've used here back in the day.
```
function x(s){return require("crypto").createHash("md5").update(s+";x(x)").digest("hex")};x(x)
```
If you don't feel like [installing](https://nodejs.org/download/release/v0.9.3/) an antique version of Node.js just to test this code, rest assured it also works in the most recent version.
## Node.js REPL (version 7.0.0), 81 bytes
And here is a version using ES6's arrow functions.
```
x=s=>require("crypto").createHash("md5").update(`x=${s};x(x)`).digest("hex");x(x)
```
**Edit**: thanks to [Anders Kaseorg](https://codegolf.stackexchange.com/users/39242/anders-kaseorg) for pointing out an error in my Node.js 0.9.3 version, fixing which saved two bytes.
]