質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

2689閲覧

node.jsとPythonでそれぞれmd5を計算した結果が異なる

退会済みユーザー

退会済みユーザー

総合スコア0

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

1グッド

0クリップ

投稿2020/07/17 03:02

標題の通りです,私用で必要があるため,webで見つけたnode.jsでhashを計算するプログラムをPythonで書き起こしてみたものの,双方の結果が一致しなくて困っています.

node

1var crypto = require('crypto'); 2var fs = require('fs'); 3var args = process.argv.splice(2); 4 5/* ... */ 6 7if(args.length === 1) { 8 md5Hash(args[0]); 9} 10 11/* ... */ 12 13function md5Hash(file) { 14 const hash = crypto.createHash('md5'); 15 const input = fs.createReadStream(file); 16 input.on('readable', () => { 17 const data = input.read(); 18 if (data){ 19 hash.update(data); 20 } 21 else { 22 console.log(hash.digest('hex')); 23 } 24 }); 25}

Python

1import hashlib 2encode = "utf-8" 3text = input('変換したい文字列\n>>').rstrip() 4hash1=hashlib.md5(text.encode(encode)).hexdigest() 5print(encode+" : "+hash1)

※処理内容としてはnode.jsの方はファイルの名前を参照してそれをmd5に,Pythonはそのまま文字列を打ち込みmd5を計算するようにしているため全く同じではないですが...

結果は以下のようになります.

#node node hash.js .\files\0a39bcc9c0647cf569c6d7108726ec596007ed80 b8938f06d2bddd643769b2322dfca877 #python 変換したい文字列 >>0a39bcc9c0647cf569c6d7108726ec596007ed80 utf-8 : cf31175e3aadb0e711cdf2cfac2f640b

と,見ての通り結果が異なっています.

#試したこと
エンコード方法が両者で違うと考え,Pythonのtext.encode()をutf-8,Cp932,shift-jisでそれぞれ試しても結果は変わらなかった.

#欲しい回答
当方はこのnode.jsで得られるハッシュ列が作業で必要なため,Pythonの方をnode.jsの結果になるようにしたいのですが,node.jsを見てもmd5を単に計算しているようにしか考えられず,仕組みのよくわかっていないものを使うのは抵抗があります.知識を貸していただけたらと思います.

teamikl👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

※処理内容としてはnode.jsの方はファイルの名前を参照してそれをmd5に,Pythonはそのまま文字列を打ち込みmd5を計算するようにしているため全く同じではないですが...

計算対象のデータを同じにすると一致します。

js

1var crypto = require('crypto'); 2 3const hash = crypto.createHash('md5'); 4hash.update("0a39bcc9c0647cf569c6d7108726ec596007ed80"); 5console.log(hash.digest('hex')); 6 7// Output: cf31175e3aadb0e711cdf2cfac2f640b

ハッシュ値計算は問題ありません。問題は与えるデータが違う点です。


./files/0a39bcc9c0647cf569c6d7108726ec596007ed80 を読み込んでいますが
違いを分かりやすくするために、ファイル名を test.txt ファイルの中身は ABCとします。

node.js のコードでは、ファイル test.txt の中身の文字列 「ABC」 のハッシュ値を計算
python のコードは 「test.txt」という文字列のハッシュ値を計算。

解決策: Pythonのコードでもファイルの中のデータを読み込むように対応する。

デバッグのヒント: まずは小さなデータを対象に
「計算対象のデータ」「計算されたハッシュ値」の双方を表示すると違いに気づくと思います。


追記2

コメントに書いたpythonのコードは確認用の短いコードで、
サイズの大きなファイルには使えないので、改良版のコードを追記しておきます。

出典: https://stackoverflow.com/questions/3431825/generating-an-md5-checksum-of-a-file

import hashlib def md5sum(filename, blocksize=65536): hash = hashlib.md5() with open(filename, "rb") as f: for block in iter(lambda: f.read(blocksize), b""): hash.update(block) return hash.hexdigest() print(md5sum("./files/0a39bcc9c0647cf569c6d7108726ec596007ed80"))

投稿2020/07/17 03:28

編集2020/07/17 06:44
teamikl

総合スコア8760

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/07/17 03:34

回答ありがとうございます,node.jsはファイルの名前を読み取っていて,そのファイルと同じ名前の文字列を渡す場合(pythonのコードの実行内容),結果が同じになると考えていたのですが 実際のところはそうでは無いということですか?
teamikl

2020/07/17 03:49 編集

言語の違いは関係なく、書かれてるコードの処理内容自体が異なります。 node.js はファイルの内容を読み取っているはずです。 もしファイルの中身とファイル名が同じという事なら、 末尾の改行文字などに注意してください。 node.js 側で、console.log(data) の出力はどうなりますか? (もしくは、./files/0a39bcc9c0647cf569c6d7108726ec596007ed80 ファイルの内容を提示してください)
teamikl

2020/07/17 06:18 編集

Python側でも node.js 側と同等の処理をするなら、 同様にファイルの中身を読み取らなければいけません。 import hashlib hash1=hashlib.md5(open("./files/0a39bcc9c0647cf569c6d7108726ec596007ed80", "rb").read()).hexdigest() print(encode+" : "+hash1) > node.jsはファイルの「名前を読み取って」いて ここの認識が誤りかな?
退会済みユーザー

退会済みユーザー

2020/07/17 06:26

teamiklさんが仰っていたようにnode.jsの処理を勘違いしていたみたいです.pythonでファイルの中身を参照してそれを対象にしてみたらnode.js側と同じ結果になりました.ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問