2010-02-25 20 views

Trả lời

79

Trong tất cả các thao tác bit XOR có đặc tính xáo trộn bit tốt nhất.

này thật-bảng giải thích tại sao:

A B AND 
0 0 0 
0 1 0 
1 0 0 
1 1 1 

A B OR 
0 0 0 
0 1 1 
1 0 1 
1 1 1 

A B XOR 
0 0 0 
0 1 1 
1 0 1 
1 1 0 

Như bạn có thể nhìn thấy cho AND và OR làm một công việc nghèo tại bit trộn.

HOẶC trên trung bình sẽ tạo ra 3/4 một bit. Và mặt khác sẽ sản xuất trung bình 3/4 null-bit. Chỉ XOR có phân phối một bit so với bit-bit. Điều đó làm cho nó rất có giá trị cho việc tạo mã băm.

Hãy nhớ rằng đối với mã băm bạn muốn sử dụng càng nhiều thông tin của khóa càng tốt và nhận được phân phối tốt các giá trị băm. Nếu bạn sử dụng AND hoặc OR, bạn sẽ nhận được các con số được thiên về các số có nhiều số 0 hoặc số có nhiều số.

+5

+1 Điều này rất thông tin ..... – Bhaskar

4

XOR opertpr có thể đảo ngược, tức là giả sử tôi có một chuỗi bit 0 0 1 và tôi XOR nó với một chuỗi chút 1 1 1, các đầu ra là

0 xor 1 = 1 
0  1 = 1 
1  1 = 0 

bây giờ tôi có thể Agan xor chuỗi 1 với kết quả để lấy chuỗi thứ hai. tức là

0 1 = 1 
0 1 = 1 
1 0 = 1 

vậy, điều đó làm cho chuỗi thứ hai trở thành một khóa. Hành vi này không được tìm thấy với nhà điều hành chút khác

Vui lòng xem để biết thêm ->Why is XOR used on Cryptography?

+3

hashCode không cần phải đảo ngược. // Xin lỗi vì tiếng Anh xấu của tôi –

+0

có, nhưng một cách sử dụng XOR trong mật mã là tính chất đảo ngược của nó. – Bhaskar

15

XOR có những ưu điểm sau:

  • Nó không phụ thuộc vào thứ tự tính toán tức là a^b = b^a
  • Nó không "lãng phí" bit. Nếu bạn thay đổi ngay cả một bit trong một trong các thành phần, giá trị cuối cùng sẽ thay đổi.
  • Nhanh chóng, một chu kỳ đơn lẻ trên máy tính nguyên thủy nhất.
  • Nó bảo quản phân phối đồng đều. Nếu hai phần bạn kết hợp được phân bố đều nhau thì sự kết hợp sẽ là như thế. Nói cách khác, nó không có xu hướng thu hẹp phạm vi của tiêu hóa vào một dải hẹp hơn.

Thông tin thêm here.

+1

Thao tác xor không lãng phí bit * nếu * tất cả các bit đầu vào là độc lập, nhưng nếu nó kết hợp các bit có tương quan chặt chẽ thì nó có thể lãng phí rất nhiều. Ví dụ, nếu một có một loại đại diện cho một cặp số trong phạm vi 0-65535 và tạo thành một băm bằng cách xor'ing các số với nhau, 16 bit trên là số không trong mọi giá trị sẽ bằng không trong mã băm. Tồi tệ hơn, nếu số lượng các cá thể không cân xứng (ví dụ: 10%) có cả hai con số khớp nhau, cùng một tỷ lệ các trường hợp đó sẽ trả về 0 cho giá trị băm. – supercat

1

Có một trường hợp sử dụng khác: đối tượng trong đó (một số) trường phải được so sánh mà không liên quan đến đơn đặt hàng. Ví dụ: nếu bạn muốn một cặp (a, b) luôn bằng cặp (b, a).
XOR có thuộc tính a^b = b^a, vì vậy nó có thể được sử dụng trong hàm băm trong các trường hợp như vậy.

Ví dụ: (full đang here)

định nghĩa:

final class Connection { 
    public final int A; 
    public final int B; 

    // some code omitted 

    @Override 
    public boolean equals(Object o) { 
     if (this == o) return true; 
     if (o == null || getClass() != o.getClass()) return false; 

     Connection that = (Connection) o; 

     return (A == that.A && B == that.B || A == that.B && B == that.A); 
    } 

    @Override 
    public int hashCode() { 
     return A^B; 
    } 

    // some code omitted 
} 

sử dụng:

 HashSet<Connection> s = new HashSet<>(); 
     s.add(new Connection(1, 3)); 
     s.add(new Connection(2, 3)); 
     s.add(new Connection(3, 2)); 
     s.add(new Connection(1, 3)); 
     s.add(new Connection(2, 1)); 

     s.remove(new Connection(1, 2)); 

     for (Connection x : s) { 
      System.out.println(x); 
     } 

     // output: 
     // Connection{A=2, B=3} 
     // Connection{A=1, B=3} 
Các vấn đề liên quan