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()函数。
感谢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(),这样你可以得到你的结果,并逃避了太多调用函数的错误。
预测你看我的答案是这样做的 – 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
}
尼斯的答案。您可能需要在函数内部的某处添加Utilities.sleep(100),以防止它在使用自动填充函数时崩溃(否则,您将遇到函数被调用的频率限制) – leo
我不能似乎得到这个以匹配'md5sum(1)'做的事情;例如cli中的'frew'给出'c241183cbf6766bd86061a60d6c8fe1b'没有换行符,但函数中有'cfb5d06a43aad502d0f6219143ba0e34'。 –