如何在特定单元格中计算文本的MD5或SHA1哈希并将其设置为Google电子表格中的其他单元格?
是否有=ComputeMD5(A1)
或=ComputeSHA1(A1)
等公式?
或者可以为此编写自定义公式吗?怎么样?
答案 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);
}