【发布时间】:2018-06-23 01:15:04
【问题描述】:
对于下面给定的 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];
};
【问题讨论】:
-
C++ 和 C 中的实际解决方案会有所不同,并且联合在两者之间没有几乎相同的语义。所以选择你实际使用的一种语言。
-
第一个
union中的数据大小会因您处理的属性而异。在不知道所涉及的实际大小的情况下,您无法对其进行散列。sizeof(SOCKADDR)为您提供最大大小,而不是实际存储在其中的大小。 -
“来自 C++ 的人可能也知道这一点......” C++ 的答案可能会以“不要使用联合”开头。