mirror of
https://github.com/KevinMidboe/linguist.git
synced 2025-10-29 17:50:22 +00:00
39 lines
891 B
Ruby
39 lines
891 B
Ruby
require 'digest/md5'
|
|
|
|
module Linguist
|
|
module MD5
|
|
# Public: Create deep nested digest of value object.
|
|
#
|
|
# Useful for object comparison.
|
|
#
|
|
# obj - Object to digest.
|
|
#
|
|
# Returns String hex digest
|
|
def self.hexdigest(obj)
|
|
digest = Digest::MD5.new
|
|
|
|
case obj
|
|
when String, Symbol, Integer
|
|
digest.update "#{obj.class}"
|
|
digest.update "#{obj}"
|
|
when TrueClass, FalseClass, NilClass
|
|
digest.update "#{obj.class}"
|
|
when Array
|
|
digest.update "#{obj.class}"
|
|
for e in obj
|
|
digest.update(hexdigest(e))
|
|
end
|
|
when Hash
|
|
digest.update "#{obj.class}"
|
|
for e in obj.map { |(k, v)| hexdigest([k, v]) }.sort
|
|
digest.update(e)
|
|
end
|
|
else
|
|
raise TypeError, "can't convert #{obj.inspect} into String"
|
|
end
|
|
|
|
digest.hexdigest
|
|
end
|
|
end
|
|
end
|