【问题标题】:Do I need to use type long to store 2166136261 in Java?我需要使用 long 类型在 Java 中存储 2166136261 吗?
【发布时间】:2017-03-01 03:44:45
【问题描述】:

我正在尝试在 Java 中实现一个简单的FNV 哈希函数。该函数需要值 2166136261 作为函数参数。在一个online source中,十六进制数分配如下:

private static final int FNV_32_INIT = 0x811C9DC5;

但我认为这是不正确的,因为 2166136261 大于 2147483647,这是 int 可以容纳的最大值。

我是否正确地假设我至少需要一个 long 类型的变量才能存储值,无论是十进制还是十六进制?


编辑:

该算法中用作偏移基础的值是任意的,因此无论是 FNV_32_INIT = 2166136261 还是其他值都没有关系:

关于 offset_basis 值:

从 FNV-0 切换到 FNV-1 纯粹是为了改变 offset_basis 为非零值。该非零值的选择是 随意的。使用了字符串: chongo /../\ 因为测试人员正在查看一封来自 Landon 的电子邮件 Landon 的标准电子邮件签名行。其实做的人 那没看得很清楚。今天,Landon 使用 () 代替 并且他的 ASCII 蝙蝠使用“oo”眼睛而不是“..”,如:chongo (Landon Curt Noll) /\oo/\ 我们没有费心纠正她的错误,因为它 不要紧。在一般情况下,几乎任何 offset_basis 都会 只要它是非零的就发球。

Source

【问题讨论】:

  • 我是否正确假设我至少需要一个 long 类型的变量才能存储值,无论是十进制还是十六进制? 是乙>。并且你添加一个L 来表示常量值是一个longlong hex = 0x811C9DC5L;。并且值是正确的,当你理解 overflow.
  • @Elliott 所以网上的来源有误?
  • 我会假设在线资源理解溢出。
  • 网上的资料似乎没有声称 0x811C9DC5 等于 2166136261。
  • 我在源代码中没有看到评论。但如果他们不使用2166136261,为什么他们认为-2128831035 在散列函数中的行为相同?哈希函数指定2166136261

标签: java hash int long-integer


【解决方案1】:

是的,你是对的。

无论是十进制、十六进制、二进制、八进制、base 64 还是任何其他基数,表达式都表示相同的量级。

【讨论】:

    猜你喜欢
    • 2011-01-28
    • 2010-09-21
    • 1970-01-01
    • 1970-01-01
    • 2010-10-10
    • 2016-04-17
    • 1970-01-01
    • 1970-01-01
    • 2018-09-10
    相关资源
    最近更新 更多