Don't include ellipsis in truncated digest output

Using `truncate` to limit the length of the digest has the unwanted side
effect of adding an ellipsis when the input is longer than the limit.

Also:
 - Don't instantiate a new object for every digest
 - Rename the configuration option to `hash_digest_class`
 - Update the CHANGELOG entry to describe how to use the feature
This commit is contained in:
Eugene Kenny 2017-12-17 00:49:02 +00:00
parent 28d2968533
commit b9e7c676ca
4 changed files with 7 additions and 15 deletions

View File

@ -1,7 +1,7 @@
* Introduced `ActiveSupport::Digest` that allows to specify hash function implementation
and defaults to `Digest::MD5`.
* Allow the hash function used to generate non-sensitive digests, such as the
ETag header, to be specified with `config.active_support.hash_digest_class`.
Replaced calls to `::Digest::MD5.hexdigest` with calls to `ActiveSupport::Digest.hexdigest`.
The object provided must respond to `#hexdigest`, e.g. `Digest::SHA1`.
*Dmitri Dolguikh*

View File

@ -13,16 +13,8 @@ module ActiveSupport
end
def hexdigest(arg)
new.hexdigest(arg)
hash_digest_class.hexdigest(arg)[0...32]
end
end
def initialize(digest_class: nil)
@digest_class = digest_class || self.class.hash_digest_class
end
def hexdigest(arg)
@digest_class.hexdigest(arg).truncate(32)
end
end
end

View File

@ -68,9 +68,9 @@ module ActiveSupport
end
initializer "active_support.set_hash_digest_class" do |app|
if app.config.active_support.respond_to?(:use_hash_digest_class) && app.config.active_support.use_hash_digest_class
if app.config.active_support.respond_to?(:hash_digest_class) && app.config.active_support.hash_digest_class
ActiveSupport::Digest.hash_digest_class =
app.config.active_support.use_hash_digest_class
app.config.active_support.hash_digest_class
end
end
end

View File

@ -16,7 +16,7 @@ class DigestTest < ActiveSupport::TestCase
digest = ActiveSupport::Digest.hexdigest("hello friend")
assert_equal 32, digest.length
assert_equal ::Digest::SHA1.hexdigest("hello friend").truncate(32), digest
assert_equal ::Digest::SHA1.hexdigest("hello friend")[0...32], digest
ensure
ActiveSupport::Digest.hash_digest_class = original_hash_digest_class
end