Подтвердить что ты не робот

Хеширование текста ячейки в Google Spreadsheet

Как я могу вычислить хэш-код MD5 или SHA1 в определенной ячейке и установить его в другую ячейку в Google Таблице?

Есть ли такая формула, как =ComputeMD5(A1) или =ComputeSHA1(A1)?

Или можно написать для этого специальную формулу? Как?

4b9b3361

Ответ 1

Откройте Tools > Script Editor, затем вставьте следующий код:

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

Сохраните script после этого, а затем используйте функцию MD5() в своей электронной таблице при ссылке на ячейку.

Этот script основан на функции Utilities.computeDigest().

Ответ 2

Благодаря gabhubert для кода.

Это версия SHA1 этого кода (очень простое изменение)

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

Ответ 3

Хорошо, получилось,

Необходимо создать пользовательскую функцию, как описано в http://code.google.com/googleapps/appsscript/articles/custom_function.html

И затем используйте apis, как описано в http://code.google.com/googleapps/appsscript/service_utilities.html

Мне нужно указать полное имя функции, чтобы я мог видеть результат в ячейке.

Ниже приведен образец кода, который дал базовый 64 хэш текста

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

Ответ 4

Используя ответ @gabhubert, вы можете сделать это, если хотите получить результаты из целой строки. Из редактора script.

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

И затем, в меню "Выполнить", просто запустите функцию straightToText(), чтобы вы могли получить свой результат и ускользнуть от слишком большого количества вызовов к ошибке функции.

Ответ 5

чтобы получить хеши для диапазона ячеек, добавьте это рядом с функцией gabhubert:

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

и использовать его в ячейке следующим образом:

=RangeGetMD5Hash(A5:X25)

Он возвращает диапазон тех же размеров, что и исходный, значения будут распределены вниз и справа от ячейки с помощью формул.

Универсальная однозначная функция для метода преобразования диапазона-func (ref), и она быстрее, чем отдельные формы для каждой ячейки; в этой форме он также работает для одной ячейки, поэтому, возможно, стоит переписать функцию источника таким образом.

Ответ 6

Я искал вариант, который обеспечил бы более короткий результат. Что Вы думаете об этом? Он возвращает только 4 символа. Несчастная часть состоит в том, что она использует я и o, которые можно путать для L и 0 соответственно; с правильным шрифтом и в шапках это не имеет большого значения.

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

Ответ 7

На основе @gabhubert, но используя операции массива, чтобы получить шестнадцатеричное представление

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
}