2011-11-03 24 views
19

Jak mogę obliczyć skrót mieszania MD5 lub SHA1 tekstu w określonej komórce i ustawić go w innej komórce w Arkuszu kalkulacyjnym Google?Hash tekstu komórki w Arkuszu kalkulacyjnym Google

Czy istnieje wzór taki jak =ComputeMD5(A1) lub =ComputeSHA1(A1)?

Czy jest możliwe wpisanie niestandardowej formuły? W jaki sposób?

Odpowiedz

4

Ok, rozumiem,

Trzeba utworzyć funkcję niestandardową, jak wyjaśniono w http://code.google.com/googleapps/appsscript/articles/custom_function.html

a następnie użyj funkcji API, jak wyjaśniono w http://code.google.com/googleapps/appsscript/service_utilities.html

muszę handtype pełną nazwę funkcji tak że widzę wynik w komórce.

Poniżej znajduje się przykładowy kod, który dał podstawa 64 zakodowanego hash tekstu

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

Otwarte Tools > Script Editor następnie wklej następujący kod:

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

Zapisz skrypt po tym, a następnie wykorzystać funkcja MD5() w arkuszu kalkulacyjnym podczas wskazywania komórki.

Ten skrypt bazuje na funkcji Utilities.computeDigest().

+1

Nicea odpowiedź. Możesz dodać 'Utilities.sleep (100)' gdzieś wewnątrz funkcji, aby zapobiec awariom podczas używania funkcji autouzupełniania (w przeciwnym razie przekroczony zostanie limit częstotliwości wywoływania funkcji) – leo

+0

Nie mogę wydaje się, że to pasuje do tego, co robi 'md5sum (1)'; na przykład 'frew' w cli daje' c241183cbf6766bd86061a60d6c8fe1b' bez nowej linii, ale 'cfb5d06a43aad502d0f6219143ba0e34' z funkcji. –

14

Dzięki gabhubert za kod.

To jest wersja SHA1 tego kodu (bardzo prostą zmianę)

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; 
} 
1

Korzystanie @gabhubert odpowiedź, można to zrobić, jeśli chcesz uzyskać wyniki z całego rzędu. Z edytora skryptów.

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 
    } 
} 

A potem, z menu Run, wystarczy uruchomić straightToText function(), dzięki czemu można uzyskać wynik i wymykają się zbyt wiele połączeń do błędu funkcji.

+0

przedsmak, aby spojrzeć na moją odpowiedź za to – LogicDaemon

1

dostać mieszań dla zakresu komórek, dodać kolejną funkcję do gabhubert to:

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) 
    } 
} 

i używać go w celi w ten sposób:

=RangeGetMD5Hash(A5:X25) 

zwraca zakres samych wymiarach jak źródło Po pierwsze, wartości będą rozkładane w dół i w prawo od komórki za pomocą formuł.

Jest to uniwersalna funkcja o pojedynczej wartości do metody konwersji range-func (ref) i jest o wiele szybsza niż oddzielne formuły dla każdej komórki; w tej formie działa również dla pojedynczej komórki, więc może warto w ten sposób przepisać funkcję źródła.

0

Szukałem opcji, która zapewni krótszy wynik. Co o tym myślisz? Zwraca tylko 4 znaki. Niefortunną częścią jest to, że używa i's i o, które mogą być mylone odpowiednio dla L i 0; z właściwą czcionką i czapkami nie ma większego znaczenia.

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(); 
    } 
0

podstawie @gabhubert ale przy użyciu operacji tablicowych do uzyskać szesnastkowego

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 
} 
Powiązane problemy