题:

>如何正确生成校验和,这是独一无二的,与浏览器无关的一致性?另外,我想将SHA256 / MD5校验和字符串转换为64位.
>如何在没有大量RAM要求的情况下正确读取文件以生成校验和?即我们如何在不影响RAM的情况下处理1 GB文件

例如Is it possible to read a file without loading it into memory?(见答案)

This project似乎很有希望,但也无法让它发挥作用.

我的目的是在X MB的块中逐步/递增地生成校验和.这可能有助于避免一次使用太多RAM.
以下是代码,它没有按预期工作:

let SIZE_CHECKSUM = 10 * Math.pow(1024,2); // 10 MB; But can be 1 MB too
async function GetChecksum (file: File):
Promise<string>
{
  let hashAlgorithm: CryptoJS.lib.IHasher<Object> = CryptoJS.algo.SHA256.create();
  let totalChunks: number = Math.ceil(file.size / SIZE_CHECKSUM);
  for (let chunkCount = 0,start = 0,end = 0; chunkCount < totalChunks; ++chunkCount)
  {
    end = Math.min(start + SIZE_CHECKSUM,file.size);
    let resultChunk: string = await (new Response(file.slice(start,end)).text());
    hashAlgorithm.update(resultChunk);
    start = chunkCount * SIZE_CHECKSUM;
  }
  let long: bigInt.BigInteger = bigInt.fromArray(hashAlgorithm.finalize().words,16,false);
  if(long.compareto(bigInt.zero) < 0)
    long = long.add(bigInt.one.shiftLeft(64));
  return long.toString();
}

它在不同的浏览器中显示不同的结果

解决方法

下面的代码中存在一个逻辑问题:
start = chunkCount * SIZE_CHECKSUM;  // <--- bug

变量start初始化为0,然后在第一次迭代中再次重置为0,这是不对的.
以下是使用问题中提到的相同库获取32字节SHA5校验和的方法:“emn178 / js-sha256”.

该库不提供Typescript接口,但我们可以简单地定义如下:

// Sha256.d.ts  (also name the corresponding JS file as "Sha256.js")
declare class Sha256 {
  update (data: ArrayBuffer): Sha256;
  hex (): string;
}

declare var sha256: any;
declare interface sha256 {
  create (): Sha256;
}

然后使用如下:

import "./external/Sha256"

async function GetChecksum (file: File):
Promise<string>
{
  let algorithm = sha256.create(); 
  for(let chunkCount = 0,totalChunks = Math.ceil(file.size / SIZE_CHECKSUM); 
      chunkCount < totalChunks;
      ++chunkCount)
  {
    let start = chunkCount * SIZE_CHECKSUM,end = Math.min(start + SIZE_CHECKSUM,file.size); 
    algorithm.update(await (new Response(file.slice(start,end)).arrayBuffer()));
  }
  return algorithm.hex();
}

上面的代码在我的所有浏览器中为任何块大小生成相同的校验和.

如何生成校验和并在Javascript中转换为64位非常大的文件而不会溢出RAM?的更多相关文章

  1. ios – Swift计算大文件的MD5校验和

    我正在为大型视频文件创建MD5校验和.我目前正在使用代码:但这会产生一个内存缓冲区,对于大型视频文件来说并不理想.在Swift中有没有办法计算读取文件流的MD5校验和,因此内存占用量最小?.以下是使用Swift的可能实现:需要自动释放池来释放返回的内存file.readData(),没有它的整个文件将被加载到内存中.感谢AbhiBeckert注意到这一点并提供实施.如果您需要将摘要作为十六进制编码的字符串,请更改将类型返回到String?

  2. BigInteger等同于Swift?

    在Swift有Java的BigInteger类吗?我正在Swift中进行大的计算,其正整数大于UInt64的最大数。处理这些数字的最好办法是什么?我也在使用一个BigNumber库,您可以使用它来进行大量的计算。实际上这个库是基于GNU多精度库,我写了一个Objective-C/Swift包装器。目前大型整数数学,包括大量的运算符重载是可能的。

  3. android / java中的校验和计算

    我在android/java中写了一个校验和计算函数.功能如下计算校验和的输入值为0xEF,0x01,0xEF,0x33,0x0C,0xB8,0xE5,0xFC,0x34,0xFF,0xFF.我手动计算校验和值,结果为0xCE4.当使用上面的函数时,我的答案为0xFFFFFFE4.在我的计算中是否有任何错误,如果是,那么请纠正我.谢谢解决方法字节根据JavaDocs:Thevalueofabyte

  4. JavaScript 内置对象 BigInt详细解析

    这篇文章主要介绍了JavaScript 内置对象 BigInt详细解析,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下

  5. TypeScript与JavaScript项目里引入MD5校验和

    这篇文章主要介绍了TypeScript与JavaScript项目里引入MD5校验和,MD5校验和可以用于验证网络文件传输的完整性以及防止文件被人篡改。下文我们就一起来学习TypeScript与JavaScript项目里引入MD5校验和_MD5校验,需要的朋友可以参考一下

  6. 如何针对DLL劫持来检测我的.NET应用程序?

    我们有一个带注册扩展的.NET3.5应用程序.我们如何保护它免受DLL劫持攻击?

  7. php – mysql中的bigint

    我需要存储推特推特ID号,这些数字很大,比如16位数.我想知道在mysql中使用bigint来存储它们吗?还是有另一种选择.bigint可处理多少位数?我试着查看规格,但目前尚不清楚.在MysqL表中存储这么大的数字有什么限制?

  8. Centos7.2 安装 zabbix server 3.4 及初始化工作

    Centos7.2安装zabbixserver3.4一、安装zabbixserver3.4参考连接:https://www.zabbix.com/download?zabbix=3.4&os_distribution=centos&os_version=7&db=MySQLhttps://www.zabbix.com/documentation/3.4/zh/manual/installation

  9. 可以在没有源代码的情况下分发PHP7 opcached文件吗?

    PHP7提供了一个名为opcache的字节码缓存机制.我想知道是否有任何方法可以在不分发源代码的情况下分发和运行PHP脚本的“opcached”版本.我假设在执行脚本时,PHP7将检查opcache目录中是否有匹配名称,时间戳的.bin文件,甚至可能比较校验和或哈希值.如果所有内容都匹配,PHP7将执行.bin文件而不是解析.PHP文件.即使相应的.PHP脚本不存在,也许有可能“欺骗”PHP执行.bin文件?PHP需要能够打开文件以便调用opcache;如果它不存在,则无法加载…

  10. php – bigint通过PDO截断?

    我遇到了一个问题,即通过PDO在MySQL上的BIGINT列中存储一个大整数如果我运行此测试:到现在为止还挺好…如果我直接在MysqL中运行此sql:一切正常……

随机推荐

  1. js中‘!.’是什么意思

  2. Vue如何指定不编译的文件夹和favicon.ico

    这篇文章主要介绍了Vue如何指定不编译的文件夹和favicon.ico,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  3. 基于JavaScript编写一个图片转PDF转换器

    本文为大家介绍了一个简单的 JavaScript 项目,可以将图片转换为 PDF 文件。你可以从本地选择任何一张图片,只需点击一下即可将其转换为 PDF 文件,感兴趣的可以动手尝试一下

  4. jquery点赞功能实现代码 点个赞吧!

    点赞功能很多地方都会出现,如何实现爱心点赞功能,这篇文章主要为大家详细介绍了jquery点赞功能实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  5. AngularJs上传前预览图片的实例代码

    使用AngularJs进行开发,在项目中,经常会遇到上传图片后,需在一旁预览图片内容,怎么实现这样的功能呢?今天小编给大家分享AugularJs上传前预览图片的实现代码,需要的朋友参考下吧

  6. JavaScript面向对象编程入门教程

    这篇文章主要介绍了JavaScript面向对象编程的相关概念,例如类、对象、属性、方法等面向对象的术语,并以实例讲解各种术语的使用,非常好的一篇面向对象入门教程,其它语言也可以参考哦

  7. jQuery中的通配符选择器使用总结

    通配符在控制input标签时相当好用,这里简单进行了jQuery中的通配符选择器使用总结,需要的朋友可以参考下

  8. javascript 动态调整图片尺寸实现代码

    在自己的网站上更新文章时一个比较常见的问题是:文章插图太宽,使整个网页都变形了。如果对每个插图都先进行缩放再插入的话,太麻烦了。

  9. jquery ajaxfileupload异步上传插件

    这篇文章主要为大家详细介绍了jquery ajaxfileupload异步上传插件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  10. React学习之受控组件与数据共享实例分析

    这篇文章主要介绍了React学习之受控组件与数据共享,结合实例形式分析了React受控组件与组件间数据共享相关原理与使用技巧,需要的朋友可以参考下

返回
顶部