hashes.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:4k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * Keyed 32-bit hash function using TEA in a Davis-Meyer function
  3.  *   H0 = Key
  4.  *   Hi = E Mi(Hi-1) + Hi-1
  5.  *
  6.  * (see Applied Cryptography, 2nd edition, p448).
  7.  *
  8.  * Jeremy Fitzhardinge <jeremy@zip.com.au> 1998
  9.  * 
  10.  * Jeremy has agreed to the contents of reiserfs/README. -Hans
  11.  * Yura's function is added (04/07/2000)
  12.  */
  13. //
  14. // keyed_hash
  15. // yura_hash
  16. // r5_hash
  17. //
  18. #include <linux/kernel.h> /* for printk() as called by BUG() */
  19. #include <asm/types.h>
  20. #include <asm/page.h>
  21. #define DELTA 0x9E3779B9
  22. #define FULLROUNDS 10 /* 32 is overkill, 16 is strong crypto */
  23. #define PARTROUNDS 6 /* 6 gets complete mixing */
  24. /* a, b, c, d - data; h0, h1 - accumulated hash */
  25. #define TEACORE(rounds)
  26. do {
  27. u32 sum = 0;
  28. int n = rounds;
  29. u32 b0, b1;
  30. b0 = h0;
  31. b1 = h1;
  32. do
  33. {
  34. sum += DELTA;
  35. b0 += ((b1 << 4)+a) ^ (b1+sum) ^ ((b1 >> 5)+b);
  36. b1 += ((b0 << 4)+c) ^ (b0+sum) ^ ((b0 >> 5)+d);
  37. } while(--n);
  38. h0 += b0;
  39. h1 += b1;
  40. } while(0)
  41. u32 keyed_hash(const signed char *msg, int len)
  42. {
  43. u32 k[] = { 0x9464a485, 0x542e1a94, 0x3e846bff, 0xb75bcfc3}; 
  44. u32 h0 = k[0], h1 = k[1];
  45. u32 a, b, c, d;
  46. u32 pad;
  47. int i;
  48.  
  49. // assert(len >= 0 && len < 256);
  50. pad = (u32)len | ((u32)len << 8);
  51. pad |= pad << 16;
  52. while(len >= 16)
  53. {
  54. a = (u32)msg[ 0]      |
  55.     (u32)msg[ 1] << 8 |
  56.     (u32)msg[ 2] << 16|
  57.     (u32)msg[ 3] << 24;
  58. b = (u32)msg[ 4]      |
  59.     (u32)msg[ 5] << 8 |
  60.     (u32)msg[ 6] << 16|
  61.     (u32)msg[ 7] << 24;
  62. c = (u32)msg[ 8]      |
  63.     (u32)msg[ 9] << 8 |
  64.     (u32)msg[10] << 16|
  65.     (u32)msg[11] << 24;
  66. d = (u32)msg[12]      |
  67.     (u32)msg[13] << 8 |
  68.     (u32)msg[14] << 16|
  69.     (u32)msg[15] << 24;
  70. TEACORE(PARTROUNDS);
  71. len -= 16;
  72. msg += 16;
  73. }
  74. if (len >= 12)
  75. {
  76.      //assert(len < 16);
  77. if (len >= 16)
  78.     BUG();
  79. a = (u32)msg[ 0]      |
  80.     (u32)msg[ 1] << 8 |
  81.     (u32)msg[ 2] << 16|
  82.     (u32)msg[ 3] << 24;
  83. b = (u32)msg[ 4]      |
  84.     (u32)msg[ 5] << 8 |
  85.     (u32)msg[ 6] << 16|
  86.     (u32)msg[ 7] << 24;
  87. c = (u32)msg[ 8]      |
  88.     (u32)msg[ 9] << 8 |
  89.     (u32)msg[10] << 16|
  90.     (u32)msg[11] << 24;
  91. d = pad;
  92. for(i = 12; i < len; i++)
  93. {
  94. d <<= 8;
  95. d |= msg[i];
  96. }
  97. }
  98. else if (len >= 8)
  99. {
  100.      //assert(len < 12);
  101. if (len >= 12)
  102.     BUG();
  103. a = (u32)msg[ 0]      |
  104.     (u32)msg[ 1] << 8 |
  105.     (u32)msg[ 2] << 16|
  106.     (u32)msg[ 3] << 24;
  107. b = (u32)msg[ 4]      |
  108.     (u32)msg[ 5] << 8 |
  109.     (u32)msg[ 6] << 16|
  110.     (u32)msg[ 7] << 24;
  111. c = d = pad;
  112. for(i = 8; i < len; i++)
  113. {
  114. c <<= 8;
  115. c |= msg[i];
  116. }
  117. }
  118. else if (len >= 4)
  119. {
  120.      //assert(len < 8);
  121. if (len >= 8)
  122.     BUG();
  123. a = (u32)msg[ 0]      |
  124.     (u32)msg[ 1] << 8 |
  125.     (u32)msg[ 2] << 16|
  126.     (u32)msg[ 3] << 24;
  127. b = c = d = pad;
  128. for(i = 4; i < len; i++)
  129. {
  130. b <<= 8;
  131. b |= msg[i];
  132. }
  133. }
  134. else
  135. {
  136.      //assert(len < 4);
  137. if (len >= 4)
  138.     BUG();
  139. a = b = c = d = pad;
  140. for(i = 0; i < len; i++)
  141. {
  142. a <<= 8;
  143. a |= msg[i];
  144. }
  145. }
  146. TEACORE(FULLROUNDS);
  147. /* return 0;*/
  148. return h0^h1;
  149. }
  150. /* What follows in this file is copyright 2000-2002 by Hans Reiser, and the
  151.  * licensing of what follows is governed by reiserfs/README */
  152. u32 yura_hash (const signed char *msg, int len)
  153. {
  154.     int j, pow;
  155.     u32 a, c;
  156.     int i;
  157.     
  158.     for (pow=1,i=1; i < len; i++) pow = pow * 10; 
  159.     
  160.     if (len == 1) 
  161. a = msg[0]-48;
  162.     else
  163. a = (msg[0] - 48) * pow;
  164.     
  165.     for (i=1; i < len; i++) {
  166. c = msg[i] - 48; 
  167. for (pow=1,j=i; j < len-1; j++) pow = pow * 10; 
  168. a = a + c * pow;
  169.     }
  170.     
  171.     for (; i < 40; i++) {
  172. c = '0' - 48; 
  173. for (pow=1,j=i; j < len-1; j++) pow = pow * 10; 
  174. a = a + c * pow;
  175.     }
  176.     
  177.     for (; i < 256; i++) {
  178. c = i; 
  179. for (pow=1,j=i; j < len-1; j++) pow = pow * 10; 
  180. a = a + c * pow;
  181.     }
  182.     
  183.     a = a << 7;
  184.     return a;
  185. }
  186. u32 r5_hash (const signed char *msg, int len)
  187. {
  188.   u32 a=0;
  189.   while(*msg) { 
  190.     a += *msg << 4;
  191.     a += *msg >> 4;
  192.     a *= 11;
  193.     msg++;
  194.    } 
  195.   return a;
  196. }