Gitweb: http://git.fedorahosted.org/git/cluster.git?p=cluster.git;a=commitdiff;h=bc0... Commit: bc01b7a1a057aaed39fde3daa7f484de276cedcb Parent: 980cb15f64083b3f7fc2e74b5e43588616a7e282 Author: Christine Caulfield ccaulfie@redhat.com AuthorDate: Fri Mar 26 11:44:39 2010 +0000 Committer: Christine Caulfield ccaulfie@redhat.com CommitterDate: Fri Mar 26 11:44:39 2010 +0000
cman: move fnv hash function into its own file
And add it to the COPYRIGHT exceptions file too.
Signed-off-by: Christine Caulfield ccaulfie@redhat.com --- cman/daemon/Makefile | 3 +- cman/daemon/cman-preconfig.c | 105 +++-------------------------------------- cman/daemon/fnvhash.c | 93 +++++++++++++++++++++++++++++++++++++ cman/daemon/fnvhash.h | 1 + doc/COPYRIGHT | 6 ++ 5 files changed, 110 insertions(+), 98 deletions(-)
diff --git a/cman/daemon/Makefile b/cman/daemon/Makefile index 9a495eb..1329de3 100644 --- a/cman/daemon/Makefile +++ b/cman/daemon/Makefile @@ -23,7 +23,8 @@ OBJS1= daemon.o \ barrier.o \ cmanconfig.o
-OBJS2= cman-preconfig.o +OBJS2= cman-preconfig.o \ + fnvhash.o
${TARGET1}: ${OBJS1} $(CC) -shared -Wl,-soname,$@ -o $@ $^ $(LDFLAGS) diff --git a/cman/daemon/cman-preconfig.c b/cman/daemon/cman-preconfig.c index 3339f1d..e8248b4 100644 --- a/cman/daemon/cman-preconfig.c +++ b/cman/daemon/cman-preconfig.c @@ -25,6 +25,7 @@ #define OBJDB_API struct objdb_iface_ver0 #include "cnxman-socket.h" #include "nodelist.h" +#include "fnvhash.h"
#define MAX_PATH_LEN PATH_MAX
@@ -284,99 +285,6 @@ static int add_ifaddr(struct objdb_iface_ver0 *objdb, char *mcast, char *ifaddr, return ret; }
- -/*** - * - * Fowler/Noll/Vo hash - * - * The basis of this hash algorithm was taken from an idea sent - * as reviewer comments to the IEEE POSIX P1003.2 committee by: - * - * Phong Vo (http://www.research.att.com/info/kpv/) - * Glenn Fowler (http://www.research.att.com/~gsf/) - * - * In a subsequent ballot round: - * - * Landon Curt Noll (http://www.isthe.com/chongo/) - * - * improved on their algorithm. Some people tried this hash - * and found that it worked rather well. In an EMail message - * to Landon, they named it the ``Fowler/Noll/Vo'' or FNV hash. - * - * FNV hashes are designed to be fast while maintaining a low - * collision rate. The FNV speed allows one to quickly hash lots - * of data while maintaining a reasonable collision rate. See: - * - * http://www.isthe.com/chongo/tech/comp/fnv/index.html - * - * for more details as well as other forms of the FNV hash. - *** - * - * To use the recommended 32 bit FNV-1a hash, pass FNV1_32A_INIT as the - * Fnv32_t hashval argument to fnv_32a_buf() or fnv_32a_str(). - * - *** - * - * Please do not copyright this code. This code is in the public domain. - * - * LANDON CURT NOLL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, - * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO - * EVENT SHALL LANDON CURT NOLL BE LIABLE FOR ANY SPECIAL, INDIRECT OR - * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF - * USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR - * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - * PERFORMANCE OF THIS SOFTWARE. - * - * By: - * chongo <Landon Curt Noll> /\oo/\ - * http://www.isthe.com/chongo/ - * - * Share and Enjoy! :-) - */ - -/* - * Modified to be a little more simple to understand and to provide a 16 bit - * value rather then 32 bit for cluster id generation - * - * sdake@redhat.com - */ - -/* 32 bit magic FNV-1a prime */ -#define FNV_32_PRIME ((uint32_t)0x01000193) - -/* Default initialization for FNV-1a */ -#define FNV_32_INIT ((uint32_t)0x811c9dc5) - -static uint16_t generate_hashed_cluster_id(char *str) -{ - unsigned char *s = (unsigned char *)str; - uint32_t hval = FNV_32_INIT; - uint32_t ret; - - /* - * FNV-1a hash each octet in the buffer - */ - while (*s) { - /* - * xor the bottom with the current octet - */ - hval ^= (uint32_t)*s++; - /* - * multiply by the 32 bit FNV magic prime mod 2^32 - */ - hval *= FNV_32_PRIME; - } - - /* - * Use XOR folding as recommended by authors of algorithm - * to create a different hash size that is a power of two - */ - ret = (hval >> 16) ^ (hval & 0xFFFF); - - sprintf(error_reason, "Generated hashed cluster id for '%s' is %d\n", str, ret); - return (ret); -} - static uint16_t generate_cluster_id(char *name) { int i; @@ -386,7 +294,6 @@ static uint16_t generate_cluster_id(char *name) value <<= 1; value += name[i]; } - sprintf(error_reason, "Generated cluster id for '%s' is %d\n", name, value & 0xFFFF); return value & 0xFFFF; }
@@ -1012,9 +919,11 @@ static int set_noccs_defaults(struct objdb_iface_ver0 *objdb)
if (!cluster_id) { if (use_hashed_cluster_id) - cluster_id = generate_hashed_cluster_id(cluster_name); + cluster_id = fnv_hash(cluster_name); else cluster_id = generate_cluster_id(cluster_name); + + sprintf(error_reason, "Generated cluster id for '%s' is %d\n", cluster_name, cluster_id); }
if (!nodename_env) { @@ -1206,9 +1115,11 @@ static int get_cman_globals(struct objdb_iface_ver0 *objdb)
if (!cluster_id) { if (use_hashed_cluster_id) - cluster_id = generate_hashed_cluster_id(cluster_name); + cluster_id = fnv_hash(cluster_name); else cluster_id = generate_cluster_id(cluster_name); + + sprintf(error_reason, "Generated cluster id for '%s' is %d\n", cluster_name, cluster_id); } } objdb->object_find_destroy(find_handle); @@ -1311,7 +1222,7 @@ static void setup_old_compat(struct objdb_iface_ver0 *objdb, hdb_handle_t cluste hdb_handle_t totem_handle; hdb_handle_t gfs_handle; char *value; - + use_hashed_cluster_id = 0;
/* Set groupd to backwards compatibility mode */ diff --git a/cman/daemon/fnvhash.c b/cman/daemon/fnvhash.c new file mode 100644 index 0000000..47e221a --- /dev/null +++ b/cman/daemon/fnvhash.c @@ -0,0 +1,93 @@ +#include <stdint.h> +#include "fnvhash.h" + +/*** + * + * Fowler/Noll/Vo hash + * + * The basis of this hash algorithm was taken from an idea sent + * as reviewer comments to the IEEE POSIX P1003.2 committee by: + * + * Phong Vo (http://www.research.att.com/info/kpv/) + * Glenn Fowler (http://www.research.att.com/~gsf/) + * + * In a subsequent ballot round: + * + * Landon Curt Noll (http://www.isthe.com/chongo/) + * + * improved on their algorithm. Some people tried this hash + * and found that it worked rather well. In an EMail message + * to Landon, they named it the ``Fowler/Noll/Vo'' or FNV hash. + * + * FNV hashes are designed to be fast while maintaining a low + * collision rate. The FNV speed allows one to quickly hash lots + * of data while maintaining a reasonable collision rate. See: + * + * http://www.isthe.com/chongo/tech/comp/fnv/index.html + * + * for more details as well as other forms of the FNV hash. + *** + * + * To use the recommended 32 bit FNV-1a hash, pass FNV1_32A_INIT as the + * Fnv32_t hashval argument to fnv_32a_buf() or fnv_32a_str(). + * + *** + * + * Please do not copyright this code. This code is in the public domain. + * + * LANDON CURT NOLL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO + * EVENT SHALL LANDON CURT NOLL BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF + * USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR + * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + * + * By: + * chongo <Landon Curt Noll> /\oo/\ + * http://www.isthe.com/chongo/ + * + * Share and Enjoy! :-) + */ + +/* + * Modified to be a little more simple to understand and to provide a 16 bit + * value rather then 32 bit for cluster id generation + * + * sdake@redhat.com + */ + +/* 32 bit magic FNV-1a prime */ +#define FNV_32_PRIME ((uint32_t)0x01000193) + +/* Default initialization for FNV-1a */ +#define FNV_32_INIT ((uint32_t)0x811c9dc5) + +uint16_t fnv_hash(char *str) +{ + unsigned char *s = (unsigned char *)str; + uint32_t hval = FNV_32_INIT; + uint32_t ret; + + /* + * FNV-1a hash each octet in the buffer + */ + while (*s) { + /* + * xor the bottom with the current octet + */ + hval ^= (uint32_t)*s++; + /* + * multiply by the 32 bit FNV magic prime mod 2^32 + */ + hval *= FNV_32_PRIME; + } + + /* + * Use XOR folding as recommended by authors of algorithm + * to create a different hash size that is a power of two + */ + ret = (hval >> 16) ^ (hval & 0xFFFF); + + return (ret); +} diff --git a/cman/daemon/fnvhash.h b/cman/daemon/fnvhash.h new file mode 100644 index 0000000..65e9c11 --- /dev/null +++ b/cman/daemon/fnvhash.h @@ -0,0 +1 @@ +uint16_t fnv_hash(char *str); diff --git a/doc/COPYRIGHT b/doc/COPYRIGHT index 313587b..55331b3 100644 --- a/doc/COPYRIGHT +++ b/doc/COPYRIGHT @@ -27,6 +27,12 @@ cman/qdisk/scandisk.{c,h}: Original design by: Joel Becker <Joel.Becker at oracle.com> and Fabio M. Di Nitto <fdinitto at redhat.com>
+cman/daemon/fnvhash.c + This code is in the public domain. + Phong Vo (http://www.research.att.com/info/kpv/) + Glenn Fowler (http://www.research.att.com/~gsf/) + Landon Curt Noll (http://www.isthe.com/chongo/) + dlm/doc/example.c: Author: Daniel Phillips <phillips at redhat.com>
cluster-commits@lists.fedorahosted.org