2

我必须实现一个用于文件共享的中间件系统,它必须拆分文件,这与在 bittorrent 上发生的情况不同,它同时从各种来源发送和接收单独的片段。我怎么做?它是一个库还是我必须自己实现文件拆分?

4

4 回答 4

4

将文件分成块,假设每个块 100KB。然后在每个块上计算一个 SHA 哈希(或其他一些哈希算法)。所以如果文件是 905KB,你将计算出 10 个这样的哈希值。

服务器将为它所服务的每个文件包含一个哈希定义文件。该散列定义文件将包含文件所有块的列表以及散列。因此,如果服务器正在为我们的名为 test.exe 的 905KB 文件提供服务。然后我们将有另一个名为 test.exe.hashes 的文件,其中包含该文件的 10 个哈希的列表。

客户端将下载散列定义文件,并确保它具有所有块。客户端可以单独请求每个块,下载后,它可以再次计算其末端的哈希值,以确保没有损坏。

您不需要物理拆分文件,拆分文件只是读取您感兴趣的部分。文件的第一个块是从字节范围0到102399,下一个块是从102400到204800,等等。所以只需打开文件,寻找那个位置,读取数据,然后关闭文件。

于 2008-09-30T19:29:27.530 回答
0

查看 Split & Concat(GNU 软件)的实现。

于 2008-09-30T19:43:05.920 回答
0

您可能需要考虑使用 Solomon-Reed 编码。这将使获得最终块变得更加容易。这是微软在 Avalaunch 中采取的路线。

于 2009-03-28T21:52:38.743 回答
0

出于兴趣:为什么不直接实施 BitTorrent 或类似的东西?有很多开源客户端(即Azureus),协议非常简单。还有一篇更详细的文章,但这包含一些扩展 - 值得怀疑的是,官方规范总是正确的。

于 2009-03-28T21:59:40.927 回答