user: Converte this assembly snippet into its equivalent C code:

```asm
<test_hash_string>:
  endbr64
  push   %r14
  lea    D17(%rip),%rdi
  push   %r13
  mov    $0xc350,%r13d
  push   %r12
  push   %rbp
  lea    D99(%rip),%rbp
  push   %rbx
  sub    $0x200,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,0x1f8(%rsp)
  xor    %eax,%eax
  mov    %rsp,%r12
  lea    0x1f3(%rsp),%rbx
  call   <hash_string@plt>
  xor    %edi,%edi
  mov    %rax,%r8
  movabs $0x310f11b894,%rax
  cmp    %rax,%r8
  sete   %dil
  call   <assert@plt>
  lea    D42(%rip),%rdi
  call   <hash_string@plt>
  xor    %edi,%edi
  mov    %rax,%r8
  movabs $0xd0a23b59df71,%rax
  cmp    %rax,%r8
  sete   %dil
  call   <assert@plt>
  lea    D37(%rip),%rdi
  call   <hash_string@plt>
  xor    %edi,%edi
  mov    %rax,%r8
  movabs $0x1ae6d985c3d5bf,%rax
  cmp    %rax,%r8
  sete   %dil
  call   <assert@plt>
  lea    D55(%rip),%rdi
  call   <hash_string@plt>
  xor    %edi,%edi
  mov    %rax,%r8
  movabs $0xe172e7492ba5e7eb,%rax
  cmp    %rax,%r8
  sete   %dil
  call   <assert@plt>
  lea    D79(%rip),%rdi
  call   <hash_string@plt>
  xor    %edi,%edi
  cmp    $0x2b5d6,%rax
  sete   %dil
  call   <assert@plt>
  lea    D83(%rip),%rdi
  call   <hash_string@plt>
  xor    %edi,%edi
  cmp    $0x2b606,%rax
  sete   %dil
  call   <assert@plt>
  lea    D10(%rip),%rdi
  call   <hash_string@plt>
  xor    %edi,%edi
  cmp    $0x2b5e6,%rax
  sete   %dil
  call   <assert@plt>
  lea    D127(%rip),%rdi
  call   <hash_string@plt>
  xor    %edi,%edi
  mov    %rax,%r8
  movabs $0x377ddcb7017cd32,%rax
  cmp    %rax,%r8
  sete   %dil
  call   <assert@plt>
  lea    D34(%rip),%rdi
  call   <hash_string@plt>
  xor    %edi,%edi
  mov    %rax,%r8
  movabs $0xddaf585f57bf0b3c,%rax
  cmp    %rax,%r8
  sete   %dil
  call   <assert@plt>
  lea    D129(%rip),%rdi
  call   <hash_string@plt>
  xor    %edi,%edi
  mov    %rax,%r8
  movabs $0x652e2efb4eb,%rax
  cmp    %rax,%r8
  sete   %dil
  call   <assert@plt>
  lea    D89(%rip),%rdi
  call   <hash_string@plt>
  xor    %edi,%edi
  mov    %rax,%r8
  movabs $0x96bfc1299eb84654,%rax
  cmp    %rax,%r8
  sete   %dil
  call   <assert@plt>
  lea    D98(%rip),%rdi
  call   <hash_string@plt>
  xor    %edi,%edi
  mov    %rax,%r8
  movabs $0x75d1f8cd6273577a,%rax
  cmp    %rax,%r8
  sete   %dil
  call   <assert@plt>
L41:
  mov    %r12,%r14
  nopw   0x0(%rax,%rax,1)
L32:
  xor    %eax,%eax
  call   <rand@plt>
  imul   $0x2fa0be83,%eax,%eax
  add    $0x2fa0be8,%eax
  cmp    $0x5f417d0,%eax
  ja     L52
  movb   $0x0,(%r14)
  add    $0x1,%r14
  cmp    %rbx,%r14
  jne    L32
L29:
  mov    %r12,%rdi
  movb   $0x0,0x1f3(%rsp)
  call   <hash_string@plt>
  mov    %r12,%rdi
  mov    %rax,%r14
  call   <mirror_hash_string@plt>
  xor    %edi,%edi
  cmp    %rax,%r14
  sete   %dil
  call   <assert@plt>
  sub    $0x1,%r13
  jne    L41
  mov    0x1f8(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L51
  add    $0x200,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  ret
  nopl   0x0(%rax,%rax,1)
L52:
  xor    %eax,%eax
  add    $0x1,%r14
  call   <rand@plt>
  movslq %eax,%rdx
  mov    %eax,%ecx
  imul   $0xffffffffe070381d,%rdx,%rdx
  sar    $0x1f,%ecx
  shr    $0x20,%rdx
  add    %eax,%edx
  sar    $0x6,%edx
  sub    %ecx,%edx
  lea    (%rdx,%rdx,8),%ecx
  lea    (%rdx,%rcx,8),%edx
  sub    %edx,%eax
  cltq
  movzbl 0x0(%rbp,%rax,1),%eax
  mov    %al,-0x1(%r14)
  cmp    %rbx,%r14
  jne    L32
  jmp    L29
L51:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: disassemble_data
arguments: tag: D17
type: string
name: disassemble_data
arguments: tag: D99
type: string
name: disassemble_data
arguments: tag: D42
type: string
name: disassemble_data
arguments: tag: D37
type: string
name: disassemble_data
arguments: tag: D55
type: string
name: disassemble_data
arguments: tag: D79
type: string
name: disassemble_data
arguments: tag: D83
type: string
name: disassemble_data
arguments: tag: D10
type: string
name: disassemble_data
arguments: tag: D127
type: string
name: disassemble_data
arguments: tag: D34
type: string
name: disassemble_data
arguments: tag: D129
type: string
name: disassemble_data
arguments: tag: D89
type: string
name: disassemble_data
arguments: tag: D98
type: string

tool: D17: abcde

tool: D99: ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz;:[]{}-=_+!@#$^&*()~`

tool: D42: 12abc12

tool: D37: asdfjkl;

tool: D55: qwertyuiopasdfghjkl;lkjhgfdsapoiuytrewqqwerty;;;

tool: D79: 1

tool: D83: a

tool: D10: A

tool: D127: wieruasl!

tool: D34: BADADASDADADSADFADF

tool: D129: []cxyz

tool: D89: send_help college_debt_high btc_addr_below:

tool: D98: 13oQbQZFWqdk1GHvaquNm3xhish3xQW7z4

assistant: ```c
void test_hash_string(void) {
  size_t counter;
  assert(hash_string("abcde") == 210706217108ul);
  assert(hash_string("12abc12") == 229395199025009ul);
  assert(hash_string("asdfjkl;") == 7572171320972735ul);
  assert(hash_string("qwertyuiopasdfghjkl;lkjhgfdsapoiuytrewqqwerty;;;") == 16245301107329722347ul);
  assert(hash_string("1") == 177622ul);
  assert(hash_string("a") == 177670ul);
  assert(hash_string("A") == 177638ul);
  assert(hash_string("wieruasl!") == 249912170171059506ul);
  assert(hash_string("BADADASDADADSADFADF") == 15974083569823714108ul);
  assert(hash_string("[]cxyz") == 6953064445163ul);
  assert(hash_string("send_help college_debt_high btc_addr_below:") == 10862613210741622356ul);
  assert(hash_string("13oQbQZFWqdk1GHvaquNm3xhish3xQW7z4") == 8489840333573805946ul);
  for (counter = 0; counter < 50000; ++counter) {
    char str[500];
    size_t i;
    for (i = 0; i < 499; ++i) {
      str[i] = (rand() % 43 == 0) ? ('\0') : ("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz;:[]{}-=_+!@#$^&*()~`"[rand() % 73]);
    }
    str[499] = '\0';
    assert(hash_string(str) == mirror_hash_string(str));
  }
}
```