对于下面给出的C UNION,为它计算哈希码的有效方法是什么?我应该在内存中使用原始二进制数据吗?或者我应该尝试解释UNION的内容来计算哈希码?
#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
。我应该只使用原始内存数据吗?怎么样?
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];
};
答案 0 :(得分:2)
您必须至少在一般情况下解释联盟的实际内容。原因很简单,部分可能未被使用,即无法有助于工会的有效价值。例如,结构可以在成员之间具有填充以对齐成员。对于联合,当不同的联合成员具有不同的大小时,您可以在末尾轻松填充。如果忽略这一点,那么对于所有实际目的而言相等的联合将具有不同的哈希值。