2011-11-03 49 views
19

Làm cách nào tôi có thể tính giá trị băm MD5 hoặc SHA1 trong một ô cụ thể và đặt nó vào một ô khác trong Bảng tính Google?Băm của văn bản ô trong Bảng tính Google

Có công thức như =ComputeMD5(A1) hoặc =ComputeSHA1(A1) không?

Hoặc bạn có thể viết công thức tùy chỉnh cho điều này không? Làm sao?

Trả lời

4

Ok, đã nhận nó,

Cần tạo chức năng tùy chỉnh như được giải thích trong http://code.google.com/googleapps/appsscript/articles/custom_function.html

Và sau đó sử dụng apis như được giải thích trong http://code.google.com/googleapps/appsscript/service_utilities.html

tôi cần phải handtype tên hàm hoàn chỉnh để tôi có thể thấy kết quả trong ô.

Sau đây là các mẫu mã mà đã căn cứ 64 băm được mã hóa của văn bản

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

mở Tools > Script Editor sau đó dán đoạn mã sau:

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

Lưu kịch bản sau đó và sau đó sử dụng chức năng MD5() trong bảng tính của bạn trong khi tham chiếu một ô.

Tập lệnh này dựa trên chức năng Utilities.computeDigest().

+1

Nice câu trả lời. Bạn có thể muốn thêm 'Utilities.sleep (100)' vào một nơi nào đó bên trong hàm, để ngăn không cho nó bị rơi khi sử dụng chức năng tự động điền (nếu không bạn sẽ gặp giới hạn về tần suất có thể gọi) – leo

+0

Tôi không thể dường như để có được điều này để phù hợp với những gì 'md5sum (1)' nào; ví dụ 'frew' trong cli cho' c241183cbf6766bd86061a60d6c8fe1b' không có dòng mới, nhưng 'cfb5d06a43aad502d0f6219143ba0e34' từ hàm. –

14

Nhờ gabhubert cho mã.

Đây là phiên bản SHA1 của mã (thay đổi rất đơn giản)

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

Sử dụng câu trả lời @gabhubert, bạn có thể làm được điều này, nếu bạn muốn để có được các kết quả từ các loại nguyên liên tiếp. Từ trình chỉnh sửa tập lệnh.

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

Sau đó, từ trình đơn Run, chỉ cần chạy hàm straightToText() để bạn có thể nhận được kết quả và bỏ qua quá nhiều cuộc gọi đến lỗi chức năng.

+0

foretasteing bạn nhìn vào câu trả lời của tôi để làm điều này – LogicDaemon

1

để có được băm cho một loạt các tế bào, thêm bên cạnh gabhubert của chức năng này:

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

và sử dụng nó trong tế bào theo cách này:

=RangeGetMD5Hash(A5:X25) 

Nó trả về phạm vi của cùng một kích thước như nguồn một, giá trị sẽ trải ra và ngay từ ô có công thức.

Đó là hàm giá trị đơn lẻ phổ dụng cho phương pháp chuyển đổi phạm vi-func (ref), và cách này nhanh hơn các formuleas riêng biệt cho từng ô; ở dạng này, nó cũng hoạt động cho một ô, vì vậy có lẽ nó đáng để viết lại hàm nguồn theo cách này.

0

Tôi đang tìm kiếm một tùy chọn sẽ cung cấp kết quả ngắn hơn. Bạn nghĩ gì về điều này? Nó chỉ trả về 4 ký tự. Phần không may là nó sử dụng i và o's có thể nhầm lẫn với L và 0 tương ứng; với phông chữ phù hợp và trong mũ nó sẽ không quan trọng nhiều.

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

Dựa trên @gabhubert nhưng sử dụng mảng hoạt động để có được những đại diện thập lục phân

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 
} 
Các vấn đề liên quan