Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
G
go-ipfs
概览
概览
详情
活动
周期分析
版本库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
统计图
问题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程表
图表
维基
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
jihao
go-ipfs
Commits
1f309b72
提交
1f309b72
authored
8月 30, 2014
作者:
Jeromy
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
implement basic rabin fingerprint file splitting
上级
fbd611f4
隐藏空白字符变更
内嵌
并排
正在显示
2 个修改的文件
包含
102 行增加
和
0 行删除
+102
-0
split_test.go
importer/split_test.go
+50
-0
splitting.go
importer/splitting.go
+52
-0
没有找到文件。
importer/split_test.go
0 → 100644
浏览文件 @
1f309b72
package
importer
import
(
"testing"
"crypto/rand"
"bytes"
)
func
TestDataSplitting
(
t
*
testing
.
T
)
{
buf
:=
make
([]
byte
,
16
*
1024
*
1024
)
rand
.
Read
(
buf
)
split
:=
Rabin
(
buf
)
if
len
(
split
)
==
1
{
t
.
Fatal
(
"No split occurred!"
)
}
min
:=
2
<<
15
max
:=
0
mxcount
:=
0
n
:=
0
for
_
,
b
:=
range
split
{
if
!
bytes
.
Equal
(
b
,
buf
[
n
:
n
+
len
(
b
)])
{
t
.
Fatal
(
"Split lost data!"
)
}
n
+=
len
(
b
)
if
len
(
b
)
<
min
{
min
=
len
(
b
)
}
if
len
(
b
)
>
max
{
max
=
len
(
b
)
}
if
len
(
b
)
==
16384
{
mxcount
++
}
}
if
n
!=
len
(
buf
)
{
t
.
Fatal
(
"missing some bytes!"
)
}
t
.
Log
(
len
(
split
))
t
.
Log
(
min
,
max
,
mxcount
)
}
importer/splitting.go
0 → 100644
浏览文件 @
1f309b72
package
importer
type
BlockSplitter
func
([]
byte
)
[][]
byte
// TODO: this should take a reader, not a byte array. what if we're splitting a 3TB file?
func
Rabin
(
b
[]
byte
)
[][]
byte
{
var
out
[][]
byte
windowsize
:=
uint64
(
48
)
chunk_max
:=
1024
*
16
min_blk_size
:=
2048
blk_beg_i
:=
0
prime
:=
uint64
(
61
)
var
poly
uint64
var
curchecksum
uint64
// Smaller than a window? Get outa here!
if
len
(
b
)
<=
int
(
windowsize
)
{
return
[][]
byte
{
b
}
}
i
:=
0
for
n
:=
i
;
i
<
n
+
int
(
windowsize
);
i
++
{
cur
:=
uint64
(
b
[
i
])
curchecksum
=
(
curchecksum
*
prime
)
+
cur
poly
=
(
poly
*
prime
)
+
cur
}
for
;
i
<
len
(
b
);
i
++
{
cur
:=
uint64
(
b
[
i
])
curchecksum
=
(
curchecksum
*
prime
)
+
cur
poly
=
(
poly
*
prime
)
+
cur
curchecksum
-=
(
uint64
(
b
[
i
-
1
])
*
prime
)
if
i
-
blk_beg_i
>=
chunk_max
{
// push block
out
=
append
(
out
,
b
[
blk_beg_i
:
i
])
blk_beg_i
=
i
}
// first 13 bits of polynomial are 0
if
poly
%
8192
==
0
&&
i
-
blk_beg_i
>=
min_blk_size
{
// push block
out
=
append
(
out
,
b
[
blk_beg_i
:
i
])
blk_beg_i
=
i
}
}
if
i
>
blk_beg_i
{
out
=
append
(
out
,
b
[
blk_beg_i
:
])
}
return
out
}
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论