2013-02-01 37 views
5

Cách tốt nhất để tính mã băm dựa trên giá trị của chuỗi này trong một lần truyền là gì?Làm thế nào để tính toán mã băm tốt cho một danh sách lớn các chuỗi?

Với tốt Tôi có nghĩa là nó cần phải được:

1 - nhanh: Tôi cần phải nhận được mã băm cho danh sách khổng lồ (10^3..10^8 bài) của chuỗi ngắn.

2 - xác định toàn bộ danh sách các dữ liệu rất nhiều danh sách với có lẽ chỉ vài dây khác nhau phải có mã hash khác nhau

Làm thế nào để làm điều đó trong Java?

Có thể có cách để sử dụng mã băm chuỗi hiện tại, nhưng làm cách nào để hợp nhất nhiều mã băm được tính cho các chuỗi riêng biệt?

Cảm ơn bạn.

+2

Điều gì là "tốt"? –

+1

Bạn muốn mã băm nào? Bạn chỉ muốn một băm, hoặc một cho mỗi chuỗi? –

+0

Bạn có muốn các giá trị ** mã băm ** như java đã có phương thức 'hashCode()' trên String trả về một int hay, bạn có muốn các giá trị băm như thông báo MD5 không? –

Trả lời

8

tạo lớp giữ chỗ cho chuỗi của bạn và sau đó sử dụng CRC32 class. đơn giản và nhanh chóng của nó:

import java.util.zip.CRC32; 

public class HugeStringCollection { 
    private Collection<String> strings; 

    public HugeStringCollection(Collection<String> strings) { 
     this.strings = strings; 
    } 

    public int hashCode() { 
     CRC32 crc = new CRC32(); 
     for(String string : strings) { 
      crc.update(string.getBytes()) 
     } 

     return (int)(crc.getValue()); 
    } 
} 

nếu bộ sưu tập không thay đổi, bạn có thể tính toán băm một lần và cất giữ để sử dụng lại.

+0

crc âm thanh nhanh, làm thế nào tốt là nó đại diện cho dữ liệu? – Bohdan

+0

nó đã được sử dụng rộng rãi trong xử lý tệp trong nhiều năm, ví dụ: trong ZIP nén – mantrid

+0

@mantrid làm thế nào để bạn chuyển đổi điều này để làm việc cho một danh sách các ký tự? như tôi đoán chúng ta không có getBytes cho nhân vật !? –

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