2009-12-06 54 views
5

Các sha1 hash của "abc" làbăm mật mã (sha1 hoặc md5) của dữ liệu được coi là một chuỗi trong Mathematica

a9993e364706816aba3e25717850c26c9cd0d89d 

Cách duy nhất để có được Mathematica để cho bạn biết rằng với chức năng Hash của nó là

Hash[abc, "SHA"] // IntegerString[#, 16]& 

(điều IntegerString chỉ là đầu ra nó trong hex như hầu hết các trường thực hiện.)

Lưu ý rằng

Hash["abc", "SHA"] 

cung cấp hàm băm "\" abc \ "" - không phải thứ bạn muốn! Trên thực tế, lý do duy nhất chúng tôi có thể nhận được băm chính xác của "abc" là do biểu diễn Mathematica của ký hiệu abc xảy ra là chuỗi "abc". Đối với phần lớn các chuỗi, điều này sẽ không xảy ra.

Vậy làm cách nào để bạn lấy hàm băm của chuỗi tùy ý trong Mathematica?

+2

Lưu ý rằng Hash đã thay đổi trong phiên bản 8 của Mathematica sao cho chuỗi băm giờ giống với các ngôn ngữ khác. – joebolte

Trả lời

6

Bạn có thể làm điều đó ít kludgily bằng cách sử dụng StringToStream và thực tế là FileHash có thể lấy một luồng đầu vào làm đối số. Sau đó, hàm sha1 của bạn sẽ trở thành:

sha1[s_String] := Module[{stream = StringToStream[s], hash}, 
    hash = FileHash[stream,"SHA"]; 
    Close[stream]; 
    hash] 
+0

Giải pháp này thậm chí còn chính xác hơn bởi vì 'Hash' sử dụng' StringToStream' và 'ToString' chính nó như là một trong những có thể nhìn thấy với' Dấu vết [Hash ["abc", "SHA"], _StringToStream | _ToString, TraceInternal -> True] '. Và tiếc là nó sử dụng Java rộng rãi ... –

2

Đây là kludge hoạt động. Viết chuỗi vào một tập tin tạm thời và sử dụng FileHash:

sha1[s_String] := Module[{stream, file, hash}, 
    stream = OpenWrite[]; 
    WriteString[stream, s]; 
    file = Close[stream]; 
    hash = FileHash[file, "SHA"]; 
    DeleteFile[file]; 
    hash] 

Bạn cũng có thể muốn xác định

hex = IntegerString[#, 16]&; 

và trở [email protected] trong hàm trên.

Các vấn đề liên quan