2010-04-26 31 views
25

Tôi quan tâm đến việc tối ưu hóa băm của một số tệp lớn (tối ưu hóa thời gian đồng hồ treo tường). I/O đã được tối ưu hóa đủ tốt và thiết bị I/O (SSD cục bộ) chỉ được khai thác ở mức khoảng 25% công suất, trong khi một trong các lõi CPU hoàn toàn tối đa.Thuật toán băm nào có thể song song? Tối ưu hóa băm của các tệp lớn sử dụng trên các CPU đa lõi

Tôi có nhiều lõi hơn, và trong tương lai có thể sẽ có nhiều lõi hơn. Cho đến nay tôi đã chỉ có thể gõ vào lõi nhiều hơn nếu tôi xảy ra cần nhiều băm của cùng một tập tin, nói một MD5 và một SHA256 cùng một lúc. Tôi có thể sử dụng cùng một luồng I/O để cấp hai hoặc nhiều thuật toán băm, và tôi nhận được các thuật toán nhanh hơn được thực hiện miễn phí (như xa như thời gian đồng hồ treo tường). Khi tôi hiểu hầu hết các thuật toán băm, mỗi bit mới thay đổi toàn bộ kết quả, và nó vốn dĩ là thử thách/không thể làm song song.

Có bất kỳ thuật toán băm chính thống nào song song không?
Có bất kỳ băm không chính thống nào có thể song song (và có ít nhất một triển khai mẫu có sẵn) không?

Khi các CPU trong tương lai sẽ hướng tới nhiều lõi hơn và giảm tốc độ đồng hồ, có cách nào để cải thiện hiệu suất của băm tệp không? (khác với nitơ lỏng làm mát bằng cách ép xung?) hoặc là nó vốn không song song?

+0

Ngoài ra, tôi nghe rằng hầu hết các thuật toán băm hiện tại _can_ được song song, nhưng tôi không chắc chắn những gì cần. Rõ ràng, một cách để làm điều đó sẽ là quyết định cho chính mình để băm từng, nói, 4k đoạn của tập tin, và sau đó kết hợp các băm bằng cách nào đó. XOR, có lẽ? Luôn nguy hiểm mã hóa để phát minh ra thuật toán của riêng bạn, vì vậy tôi sẽ không tin tưởng điều này nếu bạn đang bảo vệ chống lại dữ liệu độc hại giả mạo thay vì tham nhũng dữ liệu ngẫu nhiên. – sblom

+0

Tôi đọc đặc tả Skein bạn đã liên kết. Skein có một cách tiêu chuẩn để xác định kích thước lá, quạt và chiều cao cây tối đa để bất kỳ ai sử dụng cùng một thông số sẽ nhận được cùng một giá trị như nhau. kết quả băm. (Điều đó quan trọng) Tôi muốn bảo vệ chống lại sự giả mạo độc hại cũng như tham nhũng tình cờ. Tôi ước các tiêu chuẩn đã sẵn sàng rồi. – DanO

+0

http://tools.ietf.org/html/rfc1321 Dường như MD5 không dễ dàng song song, tính toán cho mỗi khối phụ thuộc vào trạng thái được tính toán với tất cả các khối trước đó. Nếu thuộc tính này không giữ, thì MD5 sẽ không an toàn (vị trí của các khối trao đổi sẽ không ảnh hưởng đến hàm băm - nó không tốt). Dù sao tôi không nói song song MD5 là không thể, chỉ _impossible lúc đầu tiên sight_. – kgadek

Trả lời

12

Thực tế, có rất nhiều nghiên cứu đang diễn ra trong lĩnh vực này. Viện Tiêu chuẩn và Công nghệ Quốc gia Hoa Kỳ hiện đang tổ chức một cuộc thi để thiết kế thế hệ tiếp theo của hàm băm cấp chính phủ. Hầu hết các đề xuất cho đó là song song.

Một ví dụ: http://www.schneier.com/skein1.2.pdf

mô tả của Wikipedia về tình trạng hiện tại của cuộc thi: http://en.wikipedia.org/wiki/SHA-3

+0

Cảm ơn các liên kết, Skein có vẻ thú vị, có các triển khai trong ít nhất nửa tá ngôn ngữ. Nó là paralellizable chỉ trong cùng một cách mà các hàm băm tuyến tính khác là ... bằng cách sử dụng một thuật toán phân tích cây tiêu chuẩn hóa. về cơ bản phần băm của nguồn, băm băm cùng nhau (trong phần một lần nữa nếu cần thiết), vv nhưng các thông số cây sau đó trở thành một phần của tham số băm, và việc xác minh yêu cầu sử dụng chính xác các tham số giống nhau một lần nữa. Tôi đoán điều này sẽ làm việc cho tôi ...nhưng nó sẽ là tốt đẹp nếu có một "tiêu chuẩn" – DanO

7

Những loại SSD nào bạn có? Việc triển khai MD5 của C của tôi chạy ở mức 400 MB/s trên một lõi Intel Core2 đơn (2,4 GHz, không phải là Intel mới nhất). Bạn có thực sự có SSD hỗ trợ băng thông 1,6 GB/s không? Tôi muốn như vậy !

Có thể áp dụng băm cây trên bất kỳ hàm băm nào. Có một vài sự tinh tế và đặc tả Skein cố gắng xử lý chúng, tích hợp một số siêu dữ liệu trong chính hàm đó (điều này không thay đổi nhiều thứ cho hiệu suất), nhưng "chế độ cây" của Skein không phải là "Skein" SHA-3. Ngay cả khi Skein được chọn là SHA-3, đầu ra của một băm chế độ cây sẽ không giống như đầu ra của "Skein đơn giản".

Hy vọng rằng, một tiêu chuẩn sẽ được xác định tại một thời điểm nào đó, để mô tả băm chung của cây. Ngay bây giờ không có gì cả. Tuy nhiên, một số giao thức đã được xác định với sự hỗ trợ cho một băm cây tùy chỉnh với hàm băm Tiger, dưới tên "TTH" (Tiger Tree Hash) hoặc "THEX" (Tree Hash Exchange Format). Đặc điểm kỹ thuật cho TTH có vẻ hơi khó nắm bắt; Tôi tìm thấy một số tham chiếu đến bản nháp đã di chuyển hoặc biến mất.

Tuy nhiên, tôi hơi mơ hồ về khái niệm. Đó là loại gọn gàng, nhưng chỉ cung cấp hiệu năng nếu bạn có thể đọc dữ liệu nhanh hơn những gì mà một lõi đơn có thể xử lý và được cung cấp chức năng phù hợp và thực hiện đúng, một lõi đơn có thể băm khá nhiều dữ liệu mỗi giây. Một hash cây lây lan qua một số lõi đòi hỏi phải có dữ liệu được gửi đến các lõi thích hợp, và 1,6 GB/s không phải là băng thông nhỏ nhất từ ​​trước tới nay.

SHA-256 và SHA-512 không phải là rất nhanh. Trong số các ứng cử viên SHA-3, giả sử một bộ vi xử lý x86 ở chế độ 64 bit, một số người trong số họ đạt được tốc độ cao (hơn 300 MB/s trên Intel Core2 Q6600 2,4 GHz của tôi, với một lõi đơn - đó là những gì tôi có thể nhận ra của SHA-1, quá), ví dụ BMW, SHABAL hoặc Skein.Về mặt mã hóa, các mẫu thiết kế này hơi mới, nhưng MD5 và SHA-1 đã được mã hóa "bị hỏng" (khá hiệu quả trong trường hợp MD5, thay vì theo lý thuyết cho SHA-1) nên bất kỳ ứng viên nào trong vòng 2 SHA-3 nên ổn thôi.

Khi tôi đặt nắp "seer", tôi thấy rằng bộ vi xử lý sẽ tiếp tục trở nên nhanh hơn RAM, đến mức chi phí băm sẽ bị lấn át bởi băng thông bộ nhớ: CPU sẽ có chu kỳ đồng hồ để rảnh trong khi chờ cho dữ liệu từ RAM chính. Tại một số điểm, toàn bộ mô hình luồng (một RAM lớn cho nhiều lõi) sẽ phải được sửa đổi.

+4

Đây là một phần off-topic; thực sự, tôi ghét khi OP yêu cầu đề xuất tối ưu hóa và * luôn luôn * có ai đó 1) đề nghị không bận tâm, nhưng để mua phần cứng tốt hơn 2) hãy thử chứng minh rằng tối ưu hóa là vô giá trị trong trường hợp đó OP đã chứng minh/cố gắng chứng minh rằng anh ấy cần nó, vì vậy tôi xem xét ý kiến ​​của bạn vô ích ["Bạn có thực sự có SSD hỗ trợ băng thông 1,6 GB/s? Tôi muốn như vậy!"]. Vì vậy, không thể cung cấp +1. – kgadek

4

Bạn không nói những gì bạn cần băm của mình. Nếu bạn không trao đổi với thế giới bên ngoài nhưng chỉ để sử dụng nội bộ, chỉ cần chia từng tập tin thành nhiều phần, tính toán và lưu trữ tất cả các tổng kiểm tra. Sau đó, bạn có thể sử dụng nhiều lõi chỉ bằng cách ném một đoạn cho mỗi cái. Hai giải pháp mà bạn nghĩ đến là chia các tệp theo các khối có kích thước cố định (đơn giản hơn, nhưng sẽ sử dụng ít lõi hơn cho các tệp nhỏ hơn mà bạn không cần tất cả sức mạnh đó) hoặc trong một số khối cố định (sẽ sử dụng tất cả các lõi cho mọi tệp). Thực sự phụ thuộc vào những gì bạn muốn đạt được và phân phối kích thước tệp của bạn trông như thế nào.

Nếu, mặt khác, bạn cần băm cho thế giới bên ngoài, vì bạn có thể đọc từ các thư trả lời khác không thể với băm "chuẩn" (ví dụ: nếu bạn muốn gửi băm SHA1 để người khác kiểm tra với các công cụ khác nhau) vì vậy bạn phải tìm một nơi khác. Giống như tính toán băm khi bạn lưu trữ tệp, để truy xuất sau này hoặc tính toán băm trong nền với lõi 'miễn phí' và lưu trữ để truy xuất sau này.

Giải pháp tốt hơn phụ thuộc vào những hạn chế của bạn là gì và bạn có thể đầu tư vào không gian, thời gian hoặc sức mạnh CPU.

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