checksum.rs 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. use crate::value;
  2. use bytes::Bytes;
  3. use crc32fast::Hasher;
  4. #[derive(Debug, Clone)]
  5. pub struct Value {
  6. bytes: Bytes,
  7. checksum: Option<u32>,
  8. }
  9. impl Value {
  10. pub fn new(bytes: Bytes) -> Self {
  11. let checksum = Self::calculate_checksum(&bytes);
  12. Self { bytes, checksum }
  13. }
  14. pub fn clone_value(&self) -> value::Value {
  15. value::Value::Blob(self.bytes.clone())
  16. }
  17. pub fn has_checksum(&self) -> bool {
  18. self.checksum.is_some()
  19. }
  20. fn calculate_checksum(bytes: &Bytes) -> Option<u32> {
  21. if bytes.len() < 1024 {
  22. None
  23. } else {
  24. let mut hasher = Hasher::new();
  25. hasher.update(bytes);
  26. Some(hasher.finalize())
  27. }
  28. }
  29. }
  30. impl PartialEq for Value {
  31. fn eq(&self, other: &Value) -> bool {
  32. if self.checksum == other.checksum && self.bytes.len() == other.bytes.len() {
  33. // The data have the same checksum now perform a more extensive
  34. // comparision
  35. return self.bytes.eq(&other.bytes);
  36. }
  37. false
  38. }
  39. }
  40. #[cfg(test)]
  41. mod test {
  42. use super::*;
  43. use crate::bytes;
  44. #[test]
  45. fn does_not_have_checksum() {
  46. let data = Value::new(bytes!(b"one"));
  47. assert!(!data.has_checksum())
  48. }
  49. #[test]
  50. fn has_checksum() {
  51. let data = Value::new(bytes!(
  52. b"
  53. one one one one one one one one one one one one one one one one one one
  54. one one one one one one one one one one one one one one one one one one
  55. one one one one one one one one one one one one one one one one one one
  56. one one one one one one one one one one one one one one one one one one
  57. one one one one one one one one one one one one one one one one one one
  58. one one one one one one one one one one one one one one one one one one
  59. one one one one one one one one one one one one one one one one one one
  60. one one one one one one one one one one one one one one one one one one
  61. one one one one one one one one one one one one one one one one one one
  62. one one one one one one one one one one one one one one one one one one
  63. one one one one one one one one one one one one one one one one one one
  64. one one one one one one one one one one one one one one one one one one
  65. one one one one one one one one one one one one one one one one one one
  66. "
  67. ));
  68. assert!(data.has_checksum())
  69. }
  70. #[test]
  71. fn compare() {
  72. let data1 = Value::new(bytes!(
  73. b"
  74. one one one one one one one one one one one one one one one one one one
  75. one one one one one one one one one one one one one one one one one one
  76. one one one one one one one one one one one one one one one one one one
  77. one one one one one one one one one one one one one one one one one one
  78. one one one one one one one one one one one one one one one one one one
  79. one one one one one one one one one one one one one one one one one one
  80. one one one one one one one one one one one one one one one one one one
  81. one one one one one one one one one one one one one one one one one one
  82. one one one one one one one one one one one one one one one one one one
  83. one one one one one one one one one one one one one one one one one one
  84. one one one one one one one one one one one one one one one one one one
  85. one one one one one one one one one one one one one one one one one one
  86. one one one one one one one one one one one one one one one one one one
  87. "
  88. ));
  89. assert!(data1.clone() == data1.clone());
  90. let data2 = Value::new(bytes!(b"one"));
  91. assert!(data2 == data2.clone());
  92. assert!(data1 != data2);
  93. }
  94. }