对于下面给定的C联合,什么是计算它的散列码的有效方法?我应该使用内存中的原始二进制数据吗?或者我应该尝试解释联合的内容来计算散列代码?
#ifdef AF_INET6
#define SOCKADDR union { \
struct sockaddr_in him4; \
struct sockaddr_in6 him6; \
}
#define SOCKADDR_LEN (ipv6_available() ? sizeof(SOCKADDR) : \
sizeof(struct sockaddr_in))
#else
#define SOCKADDR union { struct sockaddr_in him4; }
#define SOCKADDR_LEN sizeof(SOCKADDR)
#endif
我试着把它转换成
(struct sockaddr_in *)
并使用sa_in->sin_addr.s_addr
和sa_in->sin_port
。但这感觉不对。我完全忽略了。我应该只使用原始内存数据吗?怎么用?struct sockaddr_in6 {
sa_family_t sin6_family; /* AF_INET6 */
in_port_t sin6_port; /* port number */
uint32_t sin6_flowinfo; /* IPv6 flow information */
struct in6_addr sin6_addr; /* IPv6 address */
uint32_t sin6_scope_id; /* Scope ID (new in 2.4) */
};
struct in6_addr {
unsigned char s6_addr[16]; /* IPv6 address */
};
struct sockaddr_in{
short sin_family;
unsigned short sin_port;
struct in_addr sin_addr;
char sin_zero[8];
};
最佳答案
你必须解释工会的实际内容,至少在总体上是这样。原因很简单,零件可能未使用,也就是说,对工会的有效价值没有贡献。例如,结构可以在成员之间使用填充来对齐成员。对于一个联合体,当不同的联合体成员有不同的大小时,可以很容易地在末尾使用填充。如果忽略这一点,则对于所有实际用途都相等的联合将具有不同的哈希值。