Как я могу вычислить хэш-код MD5 или SHA1 в определенной ячейке и установить его в другую ячейку в Google Таблице?
Есть ли такая формула, как =ComputeMD5(A1)
или =ComputeSHA1(A1)
?
Или можно написать для этого специальную формулу? Как?
Как я могу вычислить хэш-код MD5 или SHA1 в определенной ячейке и установить его в другую ячейку в Google Таблице?
Есть ли такая формула, как =ComputeMD5(A1)
или =ComputeSHA1(A1)
?
Или можно написать для этого специальную формулу? Как?
Откройте 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;
}
Сохраните script после этого, а затем используйте функцию MD5()
в своей электронной таблице при ссылке на ячейку.
Этот script основан на функции 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;
}
Хорошо, получилось,
Необходимо создать пользовательскую функцию, как описано в 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));
}
Используя ответ @gabhubert, вы можете сделать это, если хотите получить результаты из целой строки. Из редактора script.
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(), чтобы вы могли получить свой результат и ускользнуть от слишком большого количества вызовов к ошибке функции.
чтобы получить хеши для диапазона ячеек, добавьте это рядом с функцией 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)
Он возвращает диапазон тех же размеров, что и исходный, значения будут распределены вниз и справа от ячейки с помощью формул.
Универсальная однозначная функция для метода преобразования диапазона-func (ref), и она быстрее, чем отдельные формы для каждой ячейки; в этой форме он также работает для одной ячейки, поэтому, возможно, стоит переписать функцию источника таким образом.
Я искал вариант, который обеспечил бы более короткий результат. Что Вы думаете об этом? Он возвращает только 4 символа. Несчастная часть состоит в том, что она использует я и 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
}