storage.zig 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. const std = @import("std");
  2. const backend_size = 1024 * 1024 * 100;
  3. var buf: [backend_size][]const u8 = undefined;
  4. var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator);
  5. const allocator = arena.allocator();
  6. const EMPTY = "";
  7. pub fn hashKey(k: []const u8) u32 {
  8. return djb2(k);
  9. //return xoramasrosas(k);
  10. }
  11. pub fn djb2(key: []const u8) u32 {
  12. var hash: u32 = 5381;
  13. for (key) |c| {
  14. hash = ((hash << 5) +% hash) +% c;
  15. }
  16. return hash;
  17. }
  18. pub fn xoramasrosas(k: []const u8) u32 {
  19. var hash: u32 = 17 * 22;
  20. const x = "xoramasrosas";
  21. for (k, 0..) |char, i| {
  22. hash = hash +% (char ^ x[i % 12]) << 12;
  23. }
  24. return hash;
  25. }
  26. pub fn write(key: []const u8, value: []const u8) bool {
  27. const valueCopy = allocator.dupe(u8, value) catch {
  28. std.debug.print("Failed to duplicate value for key: {s}\n", .{key});
  29. return false;
  30. };
  31. const hash = hashKey(key);
  32. buf[hash % buf.len] = valueCopy;
  33. return true;
  34. }
  35. pub fn read(key: []const u8) ?[]const u8 {
  36. const hash = hashKey(key);
  37. if (buf[hash % buf.len].len == 0) {
  38. return null;
  39. }
  40. return buf[hash % buf.len];
  41. }
  42. pub fn delete(key: []const u8) bool {
  43. const hash = hashKey(key);
  44. if (hash % buf.len >= buf.len) {
  45. return false;
  46. }
  47. buf[hash % buf.len] = EMPTY;
  48. return true;
  49. }