
# ProofCode生成步骤
端侧和服务端使用相同的文件片段计算摘要，当两边计算的摘要值相同，则表示用户拥有文件，避免出现通过文件sha256撞库其他用户文件。例外情况，当文件大小为0时，不需要计算该值。
#### 步骤1：生成存储证明种子(ProofSeed）
```
ProofSeed = HexEncode(SHA256(originValue))
```
- originValue：当使用appid的方案认证鉴权时，从请求头X-User-Id取值，其他认证鉴权方案从请求头Authorization取值。
- SHA256(String)：对于任意长度的消息，SHA256都会产生一个256位的哈希值，称作消息摘要。
- HexEncode(ByteArray)：表示以小写字母形式返回摘要的Base-16编码的函数。输入的每一个字节都表示为两个十六进制字符。
 
#### 步骤2：确定参与计算存储证明的文件二进制片段
计算出参与计算的文件二进制的开始（start）和结束位置（end）。
```
Start = LongValueUnsigned(ByteSub(SHA256(ProofSeed),24,32))%size;
End = Start+8>=Size?Size:Start+8;
```
- SHA256(String)对于任意长度的消息，SHA256都会产生一个256位的哈希值，称作消息摘要。
- ByteSub(ByteArray,Integer,Integer)表示从摘要值截取区间指定区间的Byte。该场景SHA256会返回32Byte，取摘要值的后8Byte，即\[24,32）区间对应的Byte。
- LongValueUnsigned (BitSet)表示将字节数组转换成8字节的整形值。**该函数在实现时必须去掉第一个byte的符号位，保证返回一个正整数。**
- size表示文件的大小（单位Byte）。
- 参与计算存储证明的文件二进制片段即\[Start,End)区间对应的文件二进制的片段。
 
#### 步骤3：计算存储证明
根据二进制片段，从文件的二进制数据的对应位置取出对应的数组。
```
Data = readFile(file, start, end);
proofCode = HexEncode(SHA256(Data))
```
- readFile(File,Integer,Integer)：表示从文件的指定范围读取字节数组。
- SHA256(ByteArray) ：对于任意长度的消息，SHA256都会产生一个256位的哈希值，称作消息摘要。
- HexEncode(ByteArray)：表示以小写字母形式返回摘要的Base-16编码的函数。输入的每一个字节都表示为两个十六进制字符。
 
