Issue #10696 has been updated by Jeremy Evans.


This is probably a line ending issue, with ASCII CR getting removed by File.read on Windows.  You need to read the file in binary mode to get correct results on Windows:

  Digest::SHA1.hexdigest(File.binread('test.file'))

----------------------------------------
Bug #10696: Digest implementation on Windows faulty
https://bugs.ruby-lang.org/issues/10696#change-50790

* Author: Thomas Bruderer
* Status: Open
* Priority: Normal
* Assignee: cruby-windows
* Category: platform/windows
* Target version: 
* ruby -v: ruby 2.1.5p273 (2014-11-13 revision 48405) [i386-mingw32]
* Backport: 2.0.0: UNKNOWN, 2.1: UNKNOWN, 2.2: UNKNOWN
----------------------------------------
The example I made with SHA1, but the same happens for other digests, so it seems to affect the generic implementation of the interface and not the specific hash implementations.

> Digest::SHA1.hexdigest(File.read('test.file'))
> "069171eeda5f9c72cb28cb8d3fb7bbfad57ef044"
>
> Digest::SHA1.file('test.file').hexdigest
> "8b797e38c097eb8eab5c9d061ba241b03c6e739e"

The correct hash (independently checked) is the one in the file method. The Problem seems to be coming from the Read of this binary "string".

To me it seems like it could be a Problem with the character Encoding in a string. I first thought it was stopping at the null character but a test with valid ASCII with a NULL Character in the middle did actually work correctly. I attached the test-file to reproduce this beahvior. It is a very simple File with a few non-printable Characters including NULL.

This is a very specific Problem only happening on Windows. I report it for the last Version I tested, but I also tested this on 1.9 build with the same result. The same test runs fine on Linux.

---Files--------------------------------
test.file (32 Bytes)


-- 
https://bugs.ruby-lang.org/