- 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 Character or 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 <tt>rot13</tt> 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 SHA-256 Hash of a String
- 2.36 Calculating the Levenshtein Distance Between Two Strings
- 2.37 Encoding and Decoding Base64 Strings
- 2.38 Expanding and Compressing Tab Characters
- 2.39 Wrapping Lines of Text
- 2.40 Conclusion
2.35 Calculating the SHA-256 Hash of a String
The Digest::SHA256 class produces a 256-bit hash or message digest of a string of arbitrary length. This hashing function is one-way, and does not allow for the discovery of the original message from the digest. There are also MD5, SHA384, and SHA512 classes inside Digest for each of those algorithms.
The most commonly used class method is hexdigest, but there are also digest and base64digest. They all accept a string containing the message and return the digest as a string, as shown here:
require 'digest' Digest::SHA256.hexdigest("foo")[0..20] # "2c26b46b68f" Digest::SHA256.base64digest("foo")[0..20] # "LCa0a2j/xo/" Digest::SHA256.digest("foo")[0..5] # ",&\xB4kh\xFF"
Although the digest method provides a 64-byte string containing the 512-bit digest, the hexdigest method is actually the most useful. It provides the digest as an ASCII string of 64 hex characters representing the 64 bytes.
Instances and the update method allow the hash to be built incrementally, perhaps because the data is coming from a streaming source:
secret = Digest::SHA256.new source.each { |chunk| secret.update(chunk) }
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.") cryptic.hexdigest[0..20] # "50605ba0a90"