2011-11-03 10 views
19

¿Cómo puedo calcular un hash de texto MD5 o SHA1 en una celda específica y configurarlo en otra celda en la hoja de cálculo de Google?Hash de un texto de celda en Google Spreadsheet

¿Hay una fórmula como =ComputeMD5(A1) o =ComputeSHA1(A1)?

¿O es posible escribir una fórmula personalizada para esto? ¿Cómo?

Respuesta

4

Entendido,

necesidad de crear función personalizada como se explica en http://code.google.com/googleapps/appsscript/articles/custom_function.html

Y a continuación, utilizar las API como se explica en http://code.google.com/googleapps/appsscript/service_utilities.html

necesito handtype el nombre de función completa, de modo que puedo ver el resultado en la celda.

A continuación se presenta la muestra del código que dio base 64 hash codificado del texto

function getBase64EncodedMD5(text) 
{ 
    return Utilities.base64Encode(Utilities.computeDigest(Utilities.DigestAlgorithm.MD5, text)); 
} 
41

abierto Tools > Script Editor continuación, pegue el siguiente código:

function MD5 (input) { 
    var rawHash = Utilities.computeDigest(Utilities.DigestAlgorithm.MD5, input); 
    var txtHash = ''; 
    for (i = 0; i < rawHash.length; i++) { 
    var hashVal = rawHash[i]; 
    if (hashVal < 0) { 
     hashVal += 256; 
    } 
    if (hashVal.toString(16).length == 1) { 
     txtHash += '0'; 
    } 
    txtHash += hashVal.toString(16); 
    } 
    return txtHash; 
} 

Guardar la secuencia de comandos después de eso y luego usar la función MD5() en su hoja de cálculo al hacer referencia a una celda.

Este script se basa en la función Utilities.computeDigest().

+1

respuesta Niza. Es posible que desee agregar 'Utilities.sleep (100)' en algún lugar dentro de la función, para evitar que se bloquee cuando use la función de autocompletar (de lo contrario, se encontrará con un límite en la frecuencia con que se puede llamar a una función) – leo

+0

No puedo parece hacer que esto coincida con lo que hace 'md5sum (1)'; por ejemplo 'frew' en el cli da' c241183cbf6766bd86061a60d6c8fe1b' sin línea nueva, pero 'cfb5d06a43aad502d0f6219143ba0e34' de la función. –

14

Gracias a gabhubert por el código.

Esta es la versión SHA1 de ese código (cambio muy simple)

function GetSHA1(input) { 
    var rawHash = Utilities.computeDigest(Utilities.DigestAlgorithm.SHA_1, input); 
    var txtHash = ''; 
    for (j = 0; j <rawHash.length; j++) { 
    var hashVal = rawHash[j]; 
    if (hashVal < 0) 
     hashVal += 256; 
    if (hashVal.toString(16).length == 1) 
    txtHash += "0"; 
    txtHash += hashVal.toString(16); 
    } 
    return txtHash; 
} 
1

Usando respuesta @gabhubert, se podía hacer esto, si desea obtener los resultados de una fila entera. Del editor de guiones

function GetMD5Hash(value) { 
    var rawHash = Utilities.computeDigest(Utilities.DigestAlgorithm.MD5, value); 
    var txtHash = ''; 
    for (j = 0; j <rawHash.length; j++) { 
    var hashVal = rawHash[j]; 
    if (hashVal < 0) 
     hashVal += 256; 
    if (hashVal.toString(16).length == 1) 
     txtHash += "0"; 
    txtHash += hashVal.toString(16); 
    } 
    return txtHash; 
} 

function straightToText() { 
    var ss = SpreadsheetApp.getActiveSpreadsheet().getSheets(); 
    var r = 1; 
    var n_rows = 9999; 
    var n_cols = 1; 
    var column = 1; 
    var sheet = ss[0].getRange(r, column, n_rows, ncols).getValues(); // get first sheet, a1:a9999 
    var results = []; 
    for (var i = 0; i < sheet.length; i++) { 
    var hashmd5= GetMD5Hash(sheet[i][0]); 
    results.push(hashmd5); 
    } 
    var dest_col = 3; 
    for (var j = 0; j < results.length; j++) { 
    var row = j+1; 
    ss[0].getRange(row, dest_col).setValue(results[j]); // write output to c1:c9999 as text 
    } 
} 

Y luego, en el menú Ejecutar, basta con ejecutar la función straightToText() para que pueda obtener el resultado, y eludir las demasiadas llamadas a un error de función.

+0

anticipándote a que mires mi respuesta por hacer esto – LogicDaemon

1

para obtener los hashes de un rango de celdas, añadir este lado de gabhubert función:

function RangeGetMD5Hash(input) { 
    if (input.map) {   // Test whether input is an array. 
    return input.map(GetMD5Hash); // Recurse over array if so. 
    } else { 
    return GetMD5Hash(input) 
    } 
} 

y utilizarlo en las células de esta manera:

=RangeGetMD5Hash(A5:X25) 

Devuelve gama de mismas dimensiones que la fuente uno, los valores se extenderán hacia abajo y hacia la derecha desde la celda con fórmulas.

Es el método de conversión universal de función de valor único a rango-función (ref), y es mucho más rápido que las fórmulas separadas para cada celda; de esta forma, también funciona para una sola célula, por lo que tal vez valga la pena reescribir la función de origen de esta manera.

0

Estaba buscando una opción que proporcione un resultado más corto. ¿Qué piensas sobre esto? Solo devuelve 4 caracteres. La parte desafortunada es que usa i's y o's que pueden confundirse con L's y 0's respectivamente; con la fuente correcta y en mayúsculas no importaría mucho.

function getShortMD5Hash(input) { 
    var rawHash = Utilities.computeDigest(Utilities.DigestAlgorithm.MD5, input); 
    var txtHash = ''; 
    for (j = 0; j < 16; j += 8) { 
    hashVal = (rawHash[j] + rawHash[j+1] + rawHash[j+2] + rawHash[j+3])^(rawHash[j+4] + rawHash[j+5] + rawHash[j+6] + rawHash[j+7]) 
    if (hashVal < 0) 
     hashVal += 1024; 
    if (hashVal.toString(36).length == 1) 
     txtHash += "0"; 
    txtHash += hashVal.toString(36); 
    } 
    return txtHash.toUpperCase(); 
    } 
0

Basado en @gabhubert pero utilizando operaciones de matriz para obtener la representación hexadecimal

function sha(str){ 
    return Utilities 
     .computeDigest(Utilities.DigestAlgorithm.SHA_1, str) // string to digested array of integers 
     .map(function(val) {return val<0? val+256 : val}) // correct the offset 
     .map(function(val) {return ("00" + val.toString(16)).slice(-2)}) // add padding and enconde 
     .join(''); // join in a single string 
} 
Cuestiones relacionadas