-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
yaml --- r: 188610 b: refs/heads/master c: 1654dd0 h: refs/heads/master v: v3
- Loading branch information
Sage Weil
committed
Nov 7, 2009
1 parent
0884c63
commit f0dfd13
Showing
10 changed files
with
138 additions
and
82 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,2 +1,2 @@ | ||
--- | ||
refs/heads/master: cfbbcd24a6bfd794295ee7ad76dfbff40ad6b934 | ||
refs/heads/master: 1654dd0cf5ee1827322aca156af7d96d757201c7 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,118 @@ | ||
|
||
#include "types.h" | ||
|
||
/* | ||
* Robert Jenkin's hash function. | ||
* http://burtleburtle.net/bob/hash/evahash.html | ||
* This is in the public domain. | ||
*/ | ||
#define mix(a, b, c) \ | ||
do { \ | ||
a = a - b; a = a - c; a = a ^ (c >> 13); \ | ||
b = b - c; b = b - a; b = b ^ (a << 8); \ | ||
c = c - a; c = c - b; c = c ^ (b >> 13); \ | ||
a = a - b; a = a - c; a = a ^ (c >> 12); \ | ||
b = b - c; b = b - a; b = b ^ (a << 16); \ | ||
c = c - a; c = c - b; c = c ^ (b >> 5); \ | ||
a = a - b; a = a - c; a = a ^ (c >> 3); \ | ||
b = b - c; b = b - a; b = b ^ (a << 10); \ | ||
c = c - a; c = c - b; c = c ^ (b >> 15); \ | ||
} while (0) | ||
|
||
unsigned ceph_str_hash_rjenkins(const char *str, unsigned length) | ||
{ | ||
const unsigned char *k = (const unsigned char *)str; | ||
__u32 a, b, c; /* the internal state */ | ||
__u32 len; /* how many key bytes still need mixing */ | ||
|
||
/* Set up the internal state */ | ||
len = length; | ||
a = 0x9e3779b9; /* the golden ratio; an arbitrary value */ | ||
b = a; | ||
c = 0; /* variable initialization of internal state */ | ||
|
||
/* handle most of the key */ | ||
while (len >= 12) { | ||
a = a + (k[0] + ((__u32)k[1] << 8) + ((__u32)k[2] << 16) + | ||
((__u32)k[3] << 24)); | ||
b = b + (k[4] + ((__u32)k[5] << 8) + ((__u32)k[6] << 16) + | ||
((__u32)k[7] << 24)); | ||
c = c + (k[8] + ((__u32)k[9] << 8) + ((__u32)k[10] << 16) + | ||
((__u32)k[11] << 24)); | ||
mix(a, b, c); | ||
k = k + 12; | ||
len = len - 12; | ||
} | ||
|
||
/* handle the last 11 bytes */ | ||
c = c + length; | ||
switch (len) { /* all the case statements fall through */ | ||
case 11: | ||
c = c + ((__u32)k[10] << 24); | ||
case 10: | ||
c = c + ((__u32)k[9] << 16); | ||
case 9: | ||
c = c + ((__u32)k[8] << 8); | ||
/* the first byte of c is reserved for the length */ | ||
case 8: | ||
b = b + ((__u32)k[7] << 24); | ||
case 7: | ||
b = b + ((__u32)k[6] << 16); | ||
case 6: | ||
b = b + ((__u32)k[5] << 8); | ||
case 5: | ||
b = b + k[4]; | ||
case 4: | ||
a = a + ((__u32)k[3] << 24); | ||
case 3: | ||
a = a + ((__u32)k[2] << 16); | ||
case 2: | ||
a = a + ((__u32)k[1] << 8); | ||
case 1: | ||
a = a + k[0]; | ||
/* case 0: nothing left to add */ | ||
} | ||
mix(a, b, c); | ||
|
||
return c; | ||
} | ||
|
||
/* | ||
* linux dcache hash | ||
*/ | ||
unsigned ceph_str_hash_linux(const char *str, unsigned length) | ||
{ | ||
unsigned long hash = 0; | ||
unsigned char c; | ||
|
||
while (length-- > 0) { | ||
c = *str++; | ||
hash = (hash + (c << 4) + (c >> 4)) * 11; | ||
} | ||
return hash; | ||
} | ||
|
||
|
||
unsigned ceph_str_hash(int type, const char *s, unsigned len) | ||
{ | ||
switch (type) { | ||
case CEPH_STR_HASH_LINUX: | ||
return ceph_str_hash_linux(s, len); | ||
case CEPH_STR_HASH_RJENKINS: | ||
return ceph_str_hash_rjenkins(s, len); | ||
default: | ||
return -1; | ||
} | ||
} | ||
|
||
const char *ceph_str_hash_name(int type) | ||
{ | ||
switch (type) { | ||
case CEPH_STR_HASH_LINUX: | ||
return "linux"; | ||
case CEPH_STR_HASH_RJENKINS: | ||
return "rjenkins"; | ||
default: | ||
return "unknown"; | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
#ifndef _FS_CEPH_HASH_H | ||
#define _FS_CEPH_HASH_H | ||
|
||
#define CEPH_STR_HASH_LINUX 0x1 /* linux dcache hash */ | ||
#define CEPH_STR_HASH_RJENKINS 0x2 /* robert jenkins' */ | ||
|
||
extern unsigned ceph_str_hash_linux(const char *s, unsigned len); | ||
extern unsigned ceph_str_hash_rjenkins(const char *s, unsigned len); | ||
|
||
extern unsigned ceph_str_hash(int type, const char *s, unsigned len); | ||
extern const char *ceph_str_hash_name(int type); | ||
|
||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters