什么是计算C联盟哈希码的有效方法?

时间:2018-01-14 00:10:00

标签: c hash hashmap hashtable

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

1 个答案:

答案 0 :(得分:2)

您必须至少在一般情况下解释联盟的实际内容。原因很简单,部分可能未被使用,即无法有助于工会的有效价值。例如,结构可以在成员之间具有填充以对齐成员。对于联合,当不同的联合成员具有不同的大小时,您可以在末尾轻松填充。如果忽略这一点,那么对于所有实际目的而言相等的联合将具有不同的哈希值。