Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google sheets Google电子表格中单元格文本的哈希_Google Sheets_Google Search Api - Fatal编程技术网

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

Google sheets Google电子表格中单元格文本的哈希,google-sheets,google-search-api,Google Sheets,Google Search Api,如何计算特定单元格中文本的MD5或SHA1散列,并将其设置为Google电子表格中的另一个单元格 有没有像=ComputeMD5(A1)或=ComputeSHA1(A1)这样的公式 或者可以为此编写自定义公式吗?怎么做?好的,明白了 需要创建自定义函数,如中所述 然后使用API,如中所述 我需要手工输入完整的函数名,以便在单元格中看到结果 下面是给出文本的base64编码哈希的代码示例 function getBase64EncodedMD5(text) { return Utilit

如何计算特定单元格中文本的MD5或SHA1散列,并将其设置为Google电子表格中的另一个单元格

有没有像
=ComputeMD5(A1)
=ComputeSHA1(A1)
这样的公式

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

好的,明白了

需要创建自定义函数,如中所述

然后使用API,如中所述

我需要手工输入完整的函数名,以便在单元格中看到结果

下面是给出文本的base64编码哈希的代码示例

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

打开
Tools>scripteditor
,然后粘贴以下代码:

功能MD5(输入){
var rawHash=Utilities.computeDigest(Utilities.DigestAlgorithm.MD5,输入);
var txtHash='';
对于(i=0;i
然后保存脚本,然后在引用单元格时使用电子表格中的
MD5()
函数


此脚本基于函数。

感谢gabhubert提供的代码

这是该代码的SHA1版本(非常简单的更改)

函数GetSHA1(输入){
var rawHash=Utilities.computeDigest(Utilities.DigestAlgorithm.SHA_1,输入);
var txtHash='';

对于(j=0;j使用@gabhubert answer,如果您想从脚本编辑器中获得整行的结果,可以这样做

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
  }  
}
函数GetMD5Hash(值){ var rawHash=Utilities.computeDigest(Utilities.DigestAlgorithm.MD5,value); var txtHash='';
对于(j=0;j要获取一系列单元格的哈希值,请在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相同维度的范围,值将通过公式从单元格向下和向右传播


它是通用的单值函数到范围函数的转换方法(),并且它比每个单元格的单独公式快得多;在这种形式中,它也适用于单个单元格,所以用这种方式重写源函数可能是值得的。

我正在寻找一个可以提供更短结果的选项。你怎么看?它只返回4个字符。不幸的是,它使用了I和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();
  }
函数getShortMD5Hash(输入){ var rawHash=Utilities.computeDigest(Utilities.DigestAlgorithm.MD5,输入); var txtHash=''; 对于(j=0;j<16;j+=8){ hashVal=(rawshash[j]+rawshash[j+1]+rawshash[j+2]+rawshash[j+3])^(rawshash[j+4]+rawshash[j+5]+rawshash[j+6]+rawshash[j+7]) if(hashVal<0) hashVal+=1024; if(hashVal.toString(36.length==1) txtHash+=“0”; txtHash+=hashVal.toString(36); } 返回txtHash.toUpperCase(); }
基于@gabhubert,但使用数组操作获取十六进制表示形式

函数sha(str){
返回实用程序
.computeDigest(Utilities.DigestAlgorithm.SHA_1,str)//字符串到摘要整数数组

.map(函数(val){return val此解决方案与其他解决方案之间的区别是:

1) 它修复了上述一些解决方案在抵消
实用程序的输出方面存在的问题。computeDigest
(它抵消了128而不是256)

2) 它修复了一个问题,该问题导致一些其他解决方案在将其传递给
实用程序之前,通过调用
input
上的
JSON.stringify()
,为不同的输入生成相同的哈希值

功能MD5(输入){
var结果=”;
var byteArray=Utilities.computeDigest(Utilities.DigestAlgorithm.MD5,JSON.stringify(输入));
对于(i=0;i
我需要跨一系列单元格获取哈希值,因此我按如下方式运行它:

函数范围SHA256(输入)
{
返回数组.isArray(输入)?
input.map(行=>row.map(单元格=>SHA256(单元格)):
SHA256(输入);

}
预祝您能看到我的答案,因为我的答案很好。您可能想在函数内部的某个地方添加
实用程序。sleep(100)
以防止它在使用自动填充函数时崩溃(否则您将遇到函数调用频率的限制)。我似乎无法将其与
md5sum(1)匹配
确实如此;例如,cli中的
frew
给出了
c241183cbf6766bd86061a60d6c8fe1b
,没有换行,但是从函数中得到了
cfb5d06a43aad502d0f6219143ba0e34
。这非常有用。看起来这行
hashVal+=256
应该是
hashVal+=128
尽管如此。Utlities.computeDigest()返回字节数组。字节表示为-128到127之间的整数。添加128会将它们转换为0到256之间的数字。我会将字符集UTF8添加到摘要计算中。
Utilities.computeDigest(Utilities.DigestAlgorithm.MD5,input,Utilities.Charset.UTF8)这对我来说是失败的,直到我将var j添加到循环中。也许我犯了一个错误,也许谷歌现在比写这篇文章时更严格。Utilities.computeDigest(Utilities.DigestAlgorithm.MD5,“thisisteststring”).map(函数(chr){return(chr+256)。toString(16.slice(-2)})。join(“”)我不理解4字节散列的效用。
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;
}