gpt4 book ai didi

c# - byte[] 到 0x 十六进制字符串与 fnv1a32

转载 作者:行者123 更新时间:2023-11-30 16:37:30 24 4
gpt4 key购买 nike

我正在尝试将以下 python 代码移植到 c#

import os
import sys
import ctypes

FNV32_PRIME = 0xB3CB2E29
FNV32_BASIS = 0x319712C3

def uint32(v):
return ctypes.c_uint32(v).value

def fnv1a_hash(data):
hval = FNV32_BASIS

for i in range(0, len(data)):
hval = uint32(hval ^ data[i])
hval = uint32(hval * FNV32_PRIME)

return hval

print("starting")

if len(sys.argv) == 2:
input_file_path = sys.argv[1]
else: input_file_path = "dvars.txt"

with open(input_file_path, "r") as input_file:
for dvar_name in input_file:
dvar_name = dvar_name.rstrip("\r\n")
dvar_hash_1 = dvar_name.lower() + '\x00'
dvar_hash_2 = bytearray(dvar_hash_1.encode("ascii"))
dvar_hash = fnv1a_hash(dvar_hash_2)
final = "%-30s = 0x%08X" % (dvar_name, dvar_hash)
print(final)
print("done")

效果很好:

starting
con_gameMsgWindow0MsgTime = 0xFC60C821

到目前为止我得到了这个:

    public static class Extensions
{
private const UInt32 FnvPrime = 0xB3CB2E29;private const UInt32 FnvOffsetBasis = 0x319712C3;
public static string ToHashFnv1a32(this string text, Fnv1a32 hasher = null)
{
var bytes_encoded = Encoding.UTF8.GetBytes(text); // +'\x00'
if (hasher is null) hasher = new Fnv1a32(fnvPrime: FnvPrime, fnvOffsetBasis: FnvOffsetBasis);
var byte_hash = hasher.ComputeHash(bytes_encoded);
// int decValue = int.Parse(t, System.Globalization.NumberStyles.HexNumber);
var uint32 = BitConverter.ToUInt32(byte_hash, 0);
var uint32_hex = string.Format("{0:X}", uint32);
var uint32_dec = string.Format("{0:D}", uint32);
var stringg = BitConverter.ToString(byte_hash).Replace("-", "");
var expected_hex = string.Format("{0:X}", 0xFC60C821);
var expected_dec = string.Format("{0:D}", 0xFC60C821);
return byte_hash.ToString(); //
}
}

但出于某种原因,我得到了最奇怪的结果:

    text    "con_gameMsgWindow0LineCount"   string
hasher {Fnv1a.Fnv1a32} Fnv1a.Fnv1a32
bytes_encoded {byte[0x0000001b]} byte[]
byte_hash {byte[0x00000004]} byte[]
uint32 0x0a65c1a8 uint
uint32_hex "A65C1A8" string
uint32_dec "174440872" string
stringg "A8C1650A" string
expected_hex "FC60C821" string
expected_dec "4234201121" string

我真的在 table 上磕磕碰碰,因为我似乎无法弄清楚为什么它没有计算正确的哈希值(我正在使用 https://github.com/jslicer/FNV-1a 的修改版本以允许我更改基数和偏移量)

最佳答案

FNV1a -hash 本身适用于 C# 代码。但是,C# 代码与 Python 代码在以下有关输入数据处理的方面有所不同:

  • C# 代码不会在末尾删除 \r\n
  • C# 代码不会转换为小写字母。
  • C# 代码中没有附加 0 字节。

此外,C# 代码不使用文本 con_gameMsgWindow0MsgTime,而是使用 con_gameMsgWindow0LineCount

解决方案是在 C# 代码的 ToHashFnv1a32 方法的开头添加以下行:

text = text.TrimEnd('\r', '\n').ToLower() + "\0";

当然,相同数据必须在两个代码中用于测试。

注意:Python 代码中使用的素数和偏移量基础不同于 commonly used values .

关于c# - byte[] 到 0x 十六进制字符串与 fnv1a32,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58046753/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com