From 3944fd34ec9b7b7bf252c7169a7ebc9b84e95fbf Mon Sep 17 00:00:00 2001
From: kcwu <kcwu@63ad8ddf-47c3-0310-b6dd-a9e9d9715204>
Date: Fri, 25 Feb 2005 10:59:22 +0000
Subject: import FNV hash function. rewrite getkeep() for memory saving

git-svn-id: http://opensvn.csie.org/pttbbs/trunk/pttbbs@2544 63ad8ddf-47c3-0310-b6dd-a9e9d9715204
---
 include/fnv_hash.h  | 107 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 include/pttstruct.h |   3 +-
 2 files changed, 108 insertions(+), 2 deletions(-)
 create mode 100644 include/fnv_hash.h

(limited to 'include')

diff --git a/include/fnv_hash.h b/include/fnv_hash.h
new file mode 100644
index 00000000..9d8851bd
--- /dev/null
+++ b/include/fnv_hash.h
@@ -0,0 +1,107 @@
+/*
+ * Fowler / Noll / Vo Hash (FNV Hash)
+ * http://www.isthe.com/chongo/tech/comp/fnv/
+ *
+ * This is an implementation of the algorithms posted above.
+ * This file is placed in the public domain by Peter Wemm.
+ *
+ * $FreeBSD: src/sys/sys/fnv_hash.h,v 1.2 2001/03/20 02:10:18 peter Exp $
+ */
+
+typedef unsigned int Fnv32_t;
+typedef unsigned long long Fnv64_t;
+
+#define FNV1_32_INIT ((Fnv32_t) 33554467UL)
+#define FNV1_64_INIT ((Fnv64_t) 0xcbf29ce484222325ULL)
+
+#define FNV_32_PRIME ((Fnv32_t) 0x01000193UL)
+#define FNV_64_PRIME ((Fnv64_t) 0x100000001b3ULL)
+
+static __inline Fnv32_t
+fnv_32_buf(const void *buf, size_t len, Fnv32_t hval)
+{
+	const unsigned char *s = (const unsigned char *)buf;
+
+	while (len-- != 0) {
+		hval *= FNV_32_PRIME;
+		hval ^= *s++;
+	}
+	return hval;
+}
+
+static __inline Fnv32_t
+fnv_32_str(const char *str, Fnv32_t hval)
+{
+	const unsigned char *s = (const unsigned char *)str;
+	Fnv32_t c;
+
+	while ((c = *s++) != 0) {
+		hval *= FNV_32_PRIME;
+		hval ^= c;
+	}
+	return hval;
+}
+
+static __inline Fnv32_t
+fnv1a_32_str(const char *str, Fnv32_t hval)
+{
+	const unsigned char *s = (const unsigned char *)str;
+	Fnv32_t c;
+
+	while ((c = *s++) != 0) {
+		hval ^= c;
+		hval *= FNV_32_PRIME;
+	}
+	return hval;
+}
+
+static __inline Fnv32_t
+fnv1a_32_strcase(const char *str, Fnv32_t hval)
+{
+	const unsigned char *s = (const unsigned char *)str;
+	Fnv32_t c;
+
+	while ((c = *s++) != 0) {
+		hval ^= toupper(c);
+		hval *= FNV_32_PRIME;
+	}
+	return hval;
+}
+
+static __inline Fnv64_t
+fnv_64_buf(const void *buf, size_t len, Fnv64_t hval)
+{
+	const unsigned char *s = (const unsigned char *)buf;
+
+	while (len-- != 0) {
+		hval *= FNV_64_PRIME;
+		hval ^= *s++;
+	}
+	return hval;
+}
+
+static __inline Fnv64_t
+fnv_64_str(const char *str, Fnv64_t hval)
+{
+	const unsigned char *s = (const unsigned char *)str;
+	Fnv64_t c;
+
+	while ((c = *s++) != 0) {
+		hval *= FNV_64_PRIME;
+		hval ^= c;
+	}
+	return hval;
+}
+
+static __inline Fnv64_t
+fnv1a_64_strcase(const char *str, Fnv64_t hval)
+{
+	const unsigned char *s = (const unsigned char *)str;
+	Fnv64_t c;
+
+	while ((c = *s++) != 0) {
+		hval ^= toupper(c);
+		hval *= FNV_64_PRIME;
+	}
+	return hval;
+}
diff --git a/include/pttstruct.h b/include/pttstruct.h
index ce5b5382..ca5ed911 100644
--- a/include/pttstruct.h
+++ b/include/pttstruct.h
@@ -429,10 +429,9 @@ typedef struct crosspost_t {
 #define SORT_BY_SEX   5
 
 typedef struct keeploc_t {
-    char    *key;
+    unsigned int hashkey;
     int     top_ln;
     int     crs_ln;
-    struct  keeploc_t       *next;
 } keeploc_t;
 
 #define VALID_USHM_ENTRY(X) ((X) >= 0 && (X) < USHM_SIZE)
-- 
cgit v1.2.3