it-swarm.com.de

Hash eines Zelltextes in Google Spreadsheet

Wie kann ich einen MD5- oder SHA1-Texthash in einer bestimmten Zelle berechnen und ihn auf eine andere Zelle in Google Spreadsheet setzen?

Gibt es eine Formel wie =ComputeMD5(A1) oder =ComputeSHA1(A1)?

Oder ist es möglich, benutzerdefinierte Formeln dafür zu schreiben? Wie?

31
HDB

Öffnen Sie Tools > Script Editor und fügen Sie den folgenden Code ein:

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;
}

Speichern Sie das Skript danach und verwenden Sie dann die Funktion MD5() in Ihrer Tabelle, während Sie auf eine Zelle verweisen.

Dieses Skript basiert auf der Funktion Utilities.computeDigest () .

67
gabhubert

Danke an gabhubert für den Code.

Dies ist die SHA1-Version dieses Codes (sehr einfache Änderung)

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;
}
19
Sean Thompson

OK habe es,

Sie müssen eine benutzerdefinierte Funktion erstellen, wie in http://code.google.com/googleapps/appsscript/articles/custom_function.html erläutert.

Und dann verwenden Sie die apis wie in http://code.google.com/googleapps/appsscript/service_utilities.html erläutert.

Ich muss den vollständigen Funktionsnamen per Hand eingeben, damit ich das Ergebnis in der Zelle sehen kann.

Das folgende Beispiel zeigt den Code, der den Basis-64-codierten Hash des Texts angibt

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

um Hashwerte für eine Reihe von Zellen zu erhalten, fügen Sie diese neben der Funktion von gabhubert ein:

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)
  }
}

und verwenden Sie es in der Zelle auf diese Weise:

=RangeGetMD5Hash(A5:X25)

Es gibt einen Bereich mit den gleichen Dimensionen als Quelle 1 zurück. Die Werte werden von der Zelle mit den Formeln nach unten und direkt nach rechts verteilt.

Es ist eine universelle Methode zur Umwandlung von Einzelwerten in Entfernungsfunktionen ( ref ) und viel schneller als separate Formeln für jede Zelle. In dieser Form funktioniert es auch für einzelne Zellen. Vielleicht lohnt es sich, die Quellfunktion auf diese Weise neu zu schreiben.

2
LogicDaemon

Mit @gabhubert answer können Sie dies tun, wenn Sie die Ergebnisse aus einer ganzen Zeile erhalten möchten. Aus dem Skripteditor.

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
  }  
}

Führen Sie dann im Menü Ausführen die Funktion straightToText () aus, damit Sie Ihr Ergebnis erhalten und die zu vielen Aufrufe eines Funktionsfehlers vermeiden können.

1
Albert Camps

Der Unterschied zwischen dieser Lösung und den anderen ist:

1) Es behebt ein Problem, das einige der obigen Lösungen beim Versetzen der Ausgabe von Utilities.computeDigest hatten (es versetzt sich um 128 statt 256).

2) Es behebt ein Problem, bei dem andere Lösungen denselben Hash für verschiedene Eingaben erzeugen, indem sie JSON.stringify() für input aufrufen, bevor sie an Utilities.computeDigest() übergeben werden.

function MD5(input) {
  var result = "";
  var byteArray = Utilities.computeDigest(Utilities.DigestAlgorithm.MD5, JSON.stringify(input));
  for (i=0; i < byteArray.length; i++) {
    result += (byteArray[i] + 128).toString(16) + "-";
  }
  result = result.substring(result, result.length - 1); // remove trailing dash
  return result;
}
0
Peter Berg

Basierend auf @gabhubert, jedoch mit Array-Operationen, um die hexadezimale Darstellung zu erhalten

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
}
0
dinigo

Ich habe nach einer Option gesucht, die ein kürzeres Ergebnis liefert. Was denkst du darüber? Es werden nur 4 Zeichen zurückgegeben. Der unglückliche Teil ist, dass es i und o verwendet, die für L bzw. 0 verwirrt werden können; Mit der richtigen Schriftart und in Großbuchstaben würde es nicht viel ausmachen.

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
donL