对于下面给定的 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];
};
最佳答案
您必须解释 union 的实际内容,至少在一般情况下。原因很简单,零件可能未被使用,即不会对 union 的有效值(value)做出贡献。例如,一个结构可能在成员之间有填充以对齐成员。对于 union ,当不同的 union 成员有不同的大小时,你可以很容易地在最后填充。如果您忽略这一点,那么对于所有实际用途而言都相等的 union 将具有不同的哈希值。
关于c - 计算 C Union 的哈希码的有效方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48245509/