gpt4 book ai didi

iphone - Objective-C : Fowler–Noll–Vo (FNV) Hash implementation

转载 作者:太空狗 更新时间:2023-10-30 03:51:38 29 4
gpt4 key购买 nike

我的 iPhone 项目中有一个 HTTP 连接器,查询必须使用 Fowler–Noll–Vo (FNV) 哈希根据用户名设置参数。

此时我有一个 Java 实现,这是代码:

long fnv_prime = 0x811C9DC5;
long hash = 0;

for(int i = 0; i < str.length(); i++)
{
hash *= fnv_prime;
hash ^= str.charAt(i);
}

现在在 iPhone 端,我这样做了:

int64_t fnv_prime = 0x811C9DC5;
int64_T hash = 0;

for (int i=0; i < [myString length]; i++)
{
hash *= fnv_prime;
hash ^= [myString characterAtIndex:i];
}

此脚本没有给我与 Java 脚本相同的结果。

在第一个循环中,我得到了这个:

哈希 = 0

hash = 100(第一个字母是“d”)

hash = 1865261300(对于 hash = 100 和 fnv_prime = -2128831035,就像在 Java 中一样)

有人看到我遗漏的东西了吗?

在此先感谢您的帮助!

最佳答案

在 Java 中,这一行:

long fnv_prime = 0x811C9DC5;

将在 fnv_prime 中产生数值 -2128831035,因为常量被解释为 int,这是 Java 中的 32 位有符号值。当写入 long 时,该值会被符号扩展。

相反,在 Objective-C 代码中:

int64_t fnv_prime = 0x811C9DC5;

0x811C9DC5 被解释为 unsigned int 常量(因为它不适合带符号的 32 位 int),带有数字值 2166136261。然后将该值写入 fnv_prime,并且没有符号可扩展,因为就 C 编译器而言,该值为正数。

因此您最终得到了 fnv_prime 的不同值,这解释了您的不同结果。

这可以在 Java 中通过添加“L”后缀来纠正,如下所示:

long fnv_prime = 0x811C9DC5L;

这会强制 Java 编译器将常量解释为 long,其数值与您通过 Objective-C 代码获得的数值相同。

关于iphone - Objective-C : Fowler–Noll–Vo (FNV) Hash implementation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2856504/

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