Fix bad hash calculation because of signed address

The addr[] was being used signed, but this causes hash calcultion
to overflow. Originally reported as Debian bug 480173.
diff --git a/lib/utils.c b/lib/utils.c
index d99deac..fa4fe3e 100644
--- a/lib/utils.c
+++ b/lib/utils.c
@@ -518,13 +518,14 @@
 struct namerec
 {
 	struct namerec *next;
+	const char *name;
 	inet_prefix addr;
-	char	    *name;
 };
 
-static struct namerec *nht[256];
+#define NHASH 257
+static struct namerec *nht[NHASH];
 
-char *resolve_address(const char *addr, int len, int af)
+static const char *resolve_address(const void *addr, int len, int af)
 {
 	struct namerec *n;
 	struct hostent *h_ent;
@@ -539,7 +540,7 @@
 		len = 4;
 	}
 
-	hash = addr[len-1] ^ addr[len-2] ^ addr[len-3] ^ addr[len-4];
+	hash = *(__u32 *)(addr + len - 4) % NHASH;
 
 	for (n = nht[hash]; n; n = n->next) {
 		if (n->addr.family == af &&
@@ -573,7 +574,8 @@
 {
 #ifdef RESOLVE_HOSTNAMES
 	if (resolve_hosts) {
-		char *n;
+		const char *n;
+
 		if (len <= 0) {
 			switch (af) {
 			case AF_INET: