Definição
Novidades na versão 8.3.
Sintaxe
$hash tem a seguinte sintaxe:
{ $hash: { input: <expression>, algorithm: <string> } }
Comportamento
input Valor | Resultado | Notas |
|---|---|---|
String UTF-8 | Input deve ser uma string UTF-8 válida. | |
|
|
Se input resolver para null ou indefinido, ou se referir a um campo ausente, $hash retornará null.
Se input for resolvido para um tipo diferente de uma string UTF-8 ou BinData, $hash retornará um erro.
Se algorithm não for um dos valores aceitos, $hash retornará um erro.
Importante
O MD5 não é um algoritmo criptograficamente seguro e não é adequado para aplicativos sensíveis à segurança. Se você estiver fazendo hash de dados confidenciais, use "sha256" em vez disso.
MD5 também está desabilitado no modo FIPS. Se sua implantação for executada com o modo FIPS ativado, utilize "sha256" ou "xxh64".
Exemplos
Os seguintes exemplos utilizam uma coleção denominada files com estes documentos:
db.files.insertMany( [ { _id: 1, filename: "report.pdf" }, { _id: 2, filename: "archive.zip" } ] )
Hash de um valor de campo
O exemplo a seguir calcula o hash SHA-256 do campo filename para cada document:
db.files.aggregate( [ { $project: { filename: 1, hash: { $hash: { input: "$filename", algorithm: "sha256" } } } } ] )
[ { _id: 1, filename: 'report.pdf', hash: Binary.createFromBase64('ZGbkUKFrd7hlxYKda2xW2fiSlWR1ZC2+uczENA/gGxU=', 0) }, { _id: 2, filename: 'archive.zip', hash: Binary.createFromBase64('jsO6p+AcJW/43CrXux9Tpmq+hHLmCKPmqJjcARAsmVA=', 0) } ]
Hash de uma string literal
O exemplo a seguir faz hash de um valor de string literal:
db.aggregate( [ { $documents: [ { val: "hello" } ] }, { $project: { _id: 0, hash: { $hash: { input: "$val", algorithm: "xxh64" } } } } ] )
[ { hash: Binary.createFromBase64('JseCfYifbaM=', 0) } ]
Hash BinData
O exemplo a seguir calcula o hash SHA-256 de um campo de dados binary:
db.binaries.insertMany( [ { _id: 1, data: new BinData(0, "aGVsbG8=") } ] )
db.binaries.aggregate( [ { $project: { hash: { $hash: { input: "$data", algorithm: "sha256" } } } } ] )
[ { _id: 1, hash: Binary.createFromBase64('LPJNul+wow4m6DsqxbninhsWHlwfp0JecwQzYpOLmCQ=', 0) } ]
input nulo ou ausente
Se input for null ou se referir a um campo ausente, $hash retornará null:
db.aggregate( [ { $documents: [ { val: null }, {} ] }, { $project: { hash: { $hash: { input: "$val", algorithm: "sha256" } } } } ] )
[ { hash: null }, { hash: null } ]