V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
f360family123
V2EX  ›  JavaScript

Python 代码转换为 Javascript 运算结果不一致

  •  
  •   f360family123 · 4 天前 · 1055 次点击
    def cid_hash_file(path):
        h = hashlib.sha1()
        size = os.path.getsize(path)
        with open(path, 'rb') as stream:
            if size < 0xF000:
                h.update(stream.read())
            else:
                h.update(stream.read(0x5000))
                stream.seek(int(size/3))
                h.update(stream.read(0x5000))
                stream.seek(size-0x5000)
                h.update(stream.read(0x5000))
        return h.hexdigest().upper()
    
    

    上面的代码用 chatGPT 转换后是这样的

    function cidHashFile(path) {
      const h = crypto.createHash('sha1');
      const size = fs.statSync(path).size;
      const stream = fs.createReadStream(path);
    
      if (size < 0xF000) {
        stream.on('data', (chunk) => {
          h.update(chunk);
        });
      } else {
        stream.on('data', (chunk) => {
          if (stream.bytesRead <= 0x5000) {
            h.update(chunk);
          } else if (stream.bytesRead >= Math.floor(size / 3) && stream.bytesRead < Math.floor(size / 3) + 0x5000) {
            h.update(chunk);
          } else if (stream.bytesRead >= size - 0x5000) {
            h.update(chunk);
          }
        });
      }
    
      stream.on('end', () => {
        const result = h.digest('hex').toUpperCase();
        console.log(result);
      });
    
      stream.on('error', (err) => {
        console.error('File reading error:', err);
      });
    }
    
    

    试了不同文件计算出来的 hash 不一致,有没有大佬知道原因的?

    第 1 条附言  ·  4 天前
    使用 ChatGPT 转换的
    5 条回复    2024-12-07 17:35:40 +08:00
    galikeoy
        1
    galikeoy  
       4 天前
    stream.seek 是连续的,createReadStream 流的 bytesRead 属性是无序的?
    kneo
        2
    kneo  
       4 天前 via Android   ❤️ 2
    第一个算法是取样,只读常数长度的数据。
    第二个算法把所有数据都读了,首先效率应该就很差。然后文件位置的判断也不对,完全不是一个东西。
    你再问一下 AI 应该就行了。
    est
        3
    est  
       4 天前   ❤️ 1
    建议标题加上 chatgpt
    paopjian
        4
    paopjian  
       4 天前
    不懂 python,但是如果要 debug,不如先不用 0x5000 这种特殊数字,直接全读文件再看结果. 不过你这是取了文件的 0 1/3 2/3 处位置的代码再计算 sha1? 我记得读文件的代码好像可以直接定位位置吧, 你这样是把文件全读了一遍吧, 性能不好
    f360family123
        5
    f360family123  
    OP
       4 天前
    @kneo 还真是,又问了一下就行了。已感谢
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2993 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 20ms · UTC 10:59 · PVG 18:59 · LAX 02:59 · JFK 05:59
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.