- 2.1 Representing Ordinary Strings
- 2.2 Representing Strings with Alternate Notations
- 2.3 Using Here-Documents
- 2.4 Finding the Length of a String
- 2.5 Processing a Line at a Time
- 2.6 Processing a Byte at a Time
- 2.7 Performing Specialized String Comparisons
- 2.8 Tokenizing a String
- 2.9 Formatting a String
- 2.10 Using Strings As IO Objects
- 2.11 Controlling Uppercase and Lowercase
- 2.12 Accessing and Assigning Substrings
- 2.13 Substituting in Strings
- 2.14 Searching a String
- 2.15 Converting Between Characters and ASCII Codes
- 2.16 Implicit and Explicit Conversion
- 2.17 Appending an Item Onto a String
- 2.18 Removing Trailing Newlines and Other Characters
- 2.19 Trimming Whitespace from a String
- 2.20 Repeating Strings
- 2.21 Embedding Expressions Within Strings
- 2.22 Delayed Interpolation of Strings
- 2.23 Parsing Comma-Separated Data
- 2.24 Converting Strings to Numbers (Decimal and Otherwise)
- 2.25 Encoding and Decoding rot13 Text
- 2.26 Encrypting Strings
- 2.27 Compressing Strings
- 2.28 Counting Characters in Strings
- 2.29 Reversing a String
- 2.30 Removing Duplicate Characters
- 2.31 Removing Specific Characters
- 2.32 Printing Special Characters
- 2.33 Generating Successive Strings
- 2.34 Calculating a 32-Bit CRC
- 2.35 Calculating the MD5 Hash of a String
- 2.36 Calculating the Levenshtein Distance Between Two Strings
- 2.37 Encoding and Decoding base64 Strings
- 2.38 Encoding and Decoding Strings (uuencode/uudecode)
- 2.39 Expanding and Compressing Tab Characters
- 2.40 Wrapping Lines of Text
- 2.41 Conclusion
2.35 Calculating the MD5 Hash of a String
The MD5 message-digest algorithm produces a 128-bit fingerprint or message digest of a message of arbitrary length. This is in the form of a hash, so the encryption is one-way and does not allow for the discovery of the original message from the digest. Ruby has an extension for a class to implement MD5; for those interested in the source code, it's in the ext/md5 directory of the standard Ruby distribution.
There are two class methods, new and md5, to create a new MD5 object. There is really no difference in them:
require 'md5' hash = MD5.md5 hash = MD5.new
There are four instance methods: clone, digest, hexdigest, and update. The clone method simply copies the object; update is used to add content to the object as follows:
hash.update("More information...")
You can also create the object and add to the message at the same time:
secret = MD5.new("Sensitive data")
If a string argument is given, it is added to the object using update. Repeated calls are equivalent to a single call with concatenated arguments:
# These two statements... cryptic.update("Data...") cryptic.update(" and more data.") # ...are equivalent to this one. cryptic.update("Data... and more data.")
The digest method provides a 16-byte binary string containing the 128-bit digest.
The hexdigest method is actually the most useful. It provides the digest as an ASCII string of 32 hex characters representing the 16 bytes. This method is equivalent to the following:
def hexdigest ret = '' digest.each_byte {|i| ret << sprintf('%02x', i) } ret end secret.hexdigest # "b30e77a94604b78bd7a7e64ad500f3c2"
In short, you can get an MD5 hash as follows:
require 'md5' m = MD5.new("Sensitive data").hexdigest