我已经在Python中完成了一个脚本,该脚本是:
hashed_string = hashlib.sha1(str(string_to_hash).encode('utf-8')).hexdigest()
它可以按我的意愿工作,但是我不知道如何在JavaScript中做到这一点。 我已经在JS中完成了此操作:
const crypto = require('crypto')
let shasum = crypto.createHash('sha1')
let hashed_string = shasum.update(JSON.stringify(string_to_hash).digest('hex'))
但是结果不一样。 有人可以帮我吗?
答案 0 :(得分:3)
您正在hash.digest()内部呼叫hash.update(),但需要在digest()
之后呼叫update()
例如
const crypto = require('crypto')
let shasum = crypto.createHash('sha1')
shasum.update(JSON.stringify(string_to_hash))
let hashed_string = shasum.digest('hex'))
或
const crypto = require('crypto')
let shasum = crypto.createHash('sha1')
let hashed_string = shasum.update(JSON.stringify(string_to_hash)).digest('hex'))
或
const crypto = require('crypto')
let hashed_string = crypto.createHash('sha1').update(JSON.stringify(string_to_hash)).digest('hex'))
假设您使用的Python与JSON.stringify()
方法返回的字符串完全相同,那么您将获得相同的结果。任何其他字符都会影响结果。
例如,这是为某些类似字符串生成的SHA1
哈希。
#1: {a:1,b:2} // ca681fb779d3b6f82af9b243c480ce4fb07e7af4
#2: {a:1, b:2} // 6327727c37c8d1893d9e341453dd1b8c7e72ffe8
#3: {"a":1,"b":2} // 4acc71e0547112eb432f0a36fb1924c4a738cb49
#4: {"a":1, "b":2} // 98e0e65ec27728cd01356be19e354d92fb2f4b46
#5: {"a":"1", "b":"2"} // a89dd0ae872ef448a6ddafc23b0752b799fe0de1
Javascript:
d = {a:1, b:2} // Simple object
JSON.stringify(d) // {"a":1,"b":2} : #3 Above
Python:
d = {"a":1, "b":2}
str(d)
"{'a': 1, 'b': 2}"
在Python中创建的字符串使用单引号,并使用其他空格字符进行格式化,因此生成的哈希值将不同。
#6: {'a': 1, 'b': 2} // 326a92518b2b2bd864ff2d88eab7c12ca44d3fd3