Я использую две разные библиотеки для генерации хеша SHA-1 для использования при проверке файлов - более старая версия библиотеки Crypto ++ и класс Digest :: SHA1, реализованный в Ruby.Хотя я видел другие случаи несовпадающих хэшей, вызванных различиями в кодировке, две библиотеки выводят хэши, которые почти идентичны.
Например, при передаче файла через каждый процесс получается следующеерезультаты:
Crypto ++ 01c15e4f46d8181b984fa2a2c740f8f67130acac
Ruby: eac15e4f46d8181b984fa2a2c740f8f67130acac
только первые два типа символов повторяются, и вы можете видеть только два разных символа, и вы можете видеть только эти два символа, и вы видите только эти два символа, и вы видите только эти два символа, и вы видите только эти два символа, и вы видите только эти символы, и вы видите только эти два символа, и вы видите только эти два символа, и вы видите только эти два символа, и вы видите только эти два символа, и вы видите только эти два символа;,Я взглянул на исходный код для каждой реализации, и единственное отличие, которое я обнаружил на первый взгляд, было в шестнадцатеричном формате данных, который используется для 160-битного хэширования.Я понятия не имею, как этот гекс используется в алгоритме, и я подумал, что, скорее всего, мне будет проще задать вопрос, если кто-то сталкивался с этой проблемой раньше.
Я включил данные изсоответствующие библиотеки ниже.Я также включил значения из OpenSSL, поскольку каждая из трех библиотек имела немного разные значения.
Crypto ++:
digest[0] = 0x67452301L;
digest[1] = 0xEFCDAB89L;
digest[2] = 0x98BADCFEL;
digest[3] = 0x10325476L;
digest[4] = 0xC3D2E1F0L;
Ruby:
context->state[0] = 0x67452301;
context->state[1] = 0xEFCDAB89;
context->state[2] = 0x98BADCFE;
context->state[3] = 0x10325476;
context->state[4] = 0xC3D2E1F0;
OpenSSL:
#define INIT_DATA_h0 0x67452301UL
#define INIT_DATA_h1 0xefcdab89UL
#define INIT_DATA_h2 0x98badcfeUL
#define INIT_DATA_h3 0x10325476UL
#define INIT_DATA_h4 0xc3d2e1f0UL
Кстати, вот код, который используется для генерации хэша в Ruby.У меня нет доступа к исходному коду для реализации Crypto ++.
File.class_eval do
def self.hash_digest filename, options = {}
opts = {:buffer_length => 1024, :method => :sha1}.update(options)
hash_func = (opts[:method].to_s == 'sha1') ? Digest::SHA1.new : Digest::MD5.new
open(filename, "r") do |f|
while !f.eof
b = f.read
hash_func.update(b)
end
end
hash_func.hexdigest
end
end