Ruby 从大数据流计算哈希

Ruby 从大数据流计算哈希,ruby,sha,Ruby,Sha,我必须从各种流(StringIO、文件、分块http响应…)计算一个散列,并且源非常大(大约100MB-1GB)。例如,我有以下代码 require 'digest' sha = Digest::SHA256.new stream = StringIO.new("test\nfoo\nbar\nhello world") # this could also be a File.open('my_file.txt') # or a chunked http response while con

我必须从各种流(StringIO、文件、分块http响应…)计算一个散列,并且源非常大(大约100MB-1GB)。例如,我有以下代码

require 'digest'

sha = Digest::SHA256.new
stream = StringIO.new("test\nfoo\nbar\nhello world")
# this could also be a File.open('my_file.txt')
# or a chunked http response

while content = stream.read(2)
  sha.update content
end

puts sha.to_s
到目前为止,这是可行的,但我想知道
sha.update
方法是如何工作的。它是否将整个字符串的副本存储在其实例中,以便将整个内容保存在内存中


这可能会导致一些严重的内存问题,当将1GB的数据加载到RAM中时(并且在同一台机器上的多个进程上执行此操作)

嗯,检查这一点很简单,不是吗?顺便问一下,下面是实现:您将如何测试它?从实现中我会说,它释放了空间(最后一行
usedspace=freespace=0;
),对吗?“您将如何测试它?”-嗯,给出一个1-2 gb的文件并观察内存使用情况?是的,这个东西不存储处理过的内容,它不需要。散列的用法是“收集”输入流,输入流的长度可能是“无限的”,并以“散列和”的形式生成有限响应。因此,sha不需要保存内存中的所有数据