对于下面给定的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_addrsa_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];
};

最佳答案

你必须解释工会的实际内容,至少在总体上是这样。原因很简单,零件可能未使用,也就是说,对工会的有效价值没有贡献。例如,结构可以在成员之间使用填充来对齐成员。对于一个联合体,当不同的联合体成员有不同的大小时,可以很容易地在末尾使用填充。如果忽略这一点,则对于所有实际用途都相等的联合将具有不同的哈希值。

10-01 19:55