Tôi đã tạo cấu trúc dữ liệu "Tọa độ" tùy chỉnh xác định vị trí của một đối tượng theo một hệ thống nhất định.Tôi làm cách nào để tạo mã băm cho cấu trúc dữ liệu tùy chỉnh?
Một phối hợp được quy định như sau:
public class Coordinate
{
public int X;
public int Y;
private int face;
public int Face
{
get { return face; }
set
{
if (value >= 6 | value < 0)
throw new Exception("Invalid face number");
else
face = value;
}
}
private int shell;
public int Shell
{
get { return shell; }
set
{
if (value < 0)
throw new Exception("No negative shell value allowed");
else
shell = value;
}
}
public Coordinate(int face, int x, int y, int shell)
{
this.X = x;
this.Y = y;
this.face = face;
this.shell = shell;
}
public static Coordinate operator +(Coordinate a, Coordinate b)
{
return new Coordinate(a.Face + b.Face, a.X + b.X, a.Y + b.Y, a.Shell + b.Shell);
}
public override bool Equals(object obj)
{
Coordinate other = (obj as Coordinate);
if (other == null)
return false;
else
return (Face == other.Face && Shell == other.Shell && X == other.X && Y == other.Y);
}
}
Hoặc, để tóm tắt, nó chứa một int Face (0-5), một int X, int Y, và int Shell. X, Y và Shell đều bị ràng buộc bên dưới ở mức 0 (bao gồm).
Tôi không có chút kinh nghiệm nào về mã băm. Tôi cần so sánh chúng để xem chúng có bình đẳng không. Tôi đã thử điều này:
private const int MULTIPLIER = 89;
[...]
int hashCode = 1;
hashCode = MULTIPLIER * hashCode + obj.X.GetHashCode();
hashCode = MULTIPLIER * hashCode + obj.Y.GetHashCode();
hashCode = MULTIPLIER * hashCode + obj.Face.GetHashCode();
hashCode = MULTIPLIER * hashCode + obj.Shell.GetHashCode();
return hashCode;
Tắt thứ mà tôi tìm thấy trong khi Googling. Nhưng khi tôi cố gắng biên dịch mã với phương pháp này, tôi khá chắc chắn nó chạy vào va chạm, vì nó không bao giờ kết thúc xây dựng. Có lẽ đi vào tất cả các loại lộn xộn vòng nghĩ rằng một loạt các tọa độ là như nhau hoặc somesuch.
Tôi xin lỗi câu hỏi này là khá tiểu học, nhưng vì một lý do nào đó tôi bị bối rối. Tôi chỉ đang tìm lời khuyên về cách viết mã băm này để nó không va chạm.
Không có vấn đề gì nếu mã băm đồng bộ. Tốt hơn là không nên va chạm, nhưng không cần thiết (và toán học cũng không thể). – Jon
http://msdn.microsoft.com/en-us/library/system.object.gethashcode%28v=vs.71%29.aspx - "Các lớp có nguồn gốc phải ghi đè GetHashCode bằng cách triển khai trả về mã băm duy nhất. " –
@MattFenwick Do nguyên tắc pigeonhole, không có điều gì như là một mã băm duy nhất cho hầu hết các loại.* Bài viết đó hơi không chính xác. Họ đã xóa dòng đó trong các phiên bản thành công. * - 'int.GetHashCode()' có lẽ là duy nhất cho mỗi số mặc dù. –