Google电子表格中的单元格文本的哈希值

时间:2011-11-03 11:54:08

标签: google-sheets google-search-api

如何在特定单元格中计算文本的MD5或SHA1哈希并将其设置为Google电子表格中的其他单元格?

是否有=ComputeMD5(A1)=ComputeSHA1(A1)等公式?

或者可以为此编写自定义公式吗?怎么样?

9 个答案:

答案 0 :(得分:72)

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

之后保存脚本,然后在引用单元格时使用电子表格中的MD5()功能。

此脚本基于Utilities.computeDigest()函数。

答案 1 :(得分:20)

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

答案 2 :(得分:5)

好的,明白了,

需要创建自定义函数,如中所述 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));
}

答案 3 :(得分:2)

获取一系列单元格的哈希值,将其添加到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)

它返回与源1相同维度的范围,值将从具有公式的单元格向下扩散。

它是范围 - 功能转换方法(ref)的通用单值函数,并且它比每个单元格的单独的formuleas更快;在这种形式下,它也适用于单个单元格,所以也许以这种方式重写源函数是值得的。

答案 4 :(得分:1)

使用@gabhubert答案,如果你想从整行获得结果,你可以这样做。从脚本编辑器。

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 :(得分:1)

基于@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
}

答案 6 :(得分:1)

此解决方案与其他解决方案之间的区别是:

1)它修复了上述解决方案中的某些问题,即使Utilities.computeDigest的输出偏移(偏移了128,而不是256)

2)它解决了一个问题,该问题导致其他解决方案通过在将JSON.stringify()传递给input之前调用Utilities.computeDigest()上的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; } 来为不同的输入产生相同的哈希值

{{1}}

答案 7 :(得分:0)

我一直在寻找能够提供更短结果的选项。你怎么看待这件事?它只返回4个字符。不幸的是,它使用的是i和o,它们可能分别与L和0混淆;使用正确的字体和大写字母并不重要。

let parameters = [
        "username": username.text!,
        "password": password.text!,
]

Alamofire.request(.POST, "your_url_here", parameters: parameters)
            .responseJSON { request, response, result in
    print(result)
}

答案 8 :(得分:0)

我需要获取一系列单元格的哈希值,所以我要这样运行它:

function RangeSHA256(input)
{
    return Array.isArray(input) ?
        input.map(row => row.map(cell => SHA256(cell))) :
        SHA256(input);
}