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

问题描述:

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

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

或者是否有可能为此编写自定义公式?怎么样?

好,我知道,

需要创建自定义功能在 http://code.google.com/googleapps/appsscript/articles/custom_function.html

解释然后使用这些API作为 http://code.google.com/googleapps/appsscript/service_utilities.html

解释我需要handtype完整的功能名称,以便我可以在单元格中看到结果。

下面是给文字

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

打开Tools > Script Editor然后将以下代码粘贴基地64编码哈希代码示例:

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

尼斯的答案。您可能需要在函数内部的某处添加Utilities.sleep(100),以防止它在使用自动填充函数时崩溃(否则,您将遇到函数被调用的频率限制) – leo

+0

我不能似乎得到这个以匹配'md5sum(1)'做的事情;例如cli中的'frew'给出'c241183cbf6766bd86061a60d6c8fe1b'没有换行符,但函数中有'cfb5d06a43aad502d0f6219143ba0e34'。 –

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

使用@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(),这样你可以得到你的结果,并逃避了太多调用函数的错误。

+0

预测你看我的答案是这样做的 – LogicDaemon

获得哈希值的单元格区域,添加此毗邻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) 

它返回相同的尺寸,来源范围一个,价值观将传播下来,并从单元格公式化。

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

我正在寻找一个可以提供较短结果的选项。你怎么看待这件事?它只返回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(); 
    } 

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