hash.go 1023 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. // Package hash contains some common hash functions suitable for use in hash
  2. // maps.
  3. package hash
  4. import "unsafe"
  5. const DJBInit uint32 = 5381
  6. func DJBCombine(acc, h uint32) uint32 {
  7. return mul33(acc) + h
  8. }
  9. func DJB(hs ...uint32) uint32 {
  10. acc := DJBInit
  11. for _, h := range hs {
  12. acc = DJBCombine(acc, h)
  13. }
  14. return acc
  15. }
  16. func UInt32(u uint32) uint32 {
  17. return u
  18. }
  19. func UInt64(u uint64) uint32 {
  20. return mul33(uint32(u>>32)) + uint32(u&0xffffffff)
  21. }
  22. func Pointer(p unsafe.Pointer) uint32 {
  23. switch unsafe.Sizeof(p) {
  24. case 4:
  25. return UInt32(uint32(uintptr(p)))
  26. case 8:
  27. return UInt64(uint64(uintptr(p)))
  28. default:
  29. panic("unhandled pointer size")
  30. }
  31. }
  32. func UIntPtr(p uintptr) uint32 {
  33. switch unsafe.Sizeof(p) {
  34. case 4:
  35. return UInt32(uint32(p))
  36. case 8:
  37. return UInt64(uint64(p))
  38. default:
  39. panic("unhandled pointer size")
  40. }
  41. }
  42. func String(s string) uint32 {
  43. h := DJBInit
  44. for i := 0; i < len(s); i++ {
  45. h = DJBCombine(h, uint32(s[i]))
  46. }
  47. return h
  48. }
  49. func mul33(u uint32) uint32 {
  50. return u<<5 + u
  51. }