草庐IT

go - 在 Go 中计算 hashCode

coder 2023-06-28 原文

Java 对象有一个hashCode,它比加密散列更便宜。如何在 Go 中实现这样的 hashCode?

最佳答案

Go programming languageopen source .您可以查看其标准库以获取快速高效的 Go 哈希实现。

这里是:

它们未导出,但如果您的应用中需要它们,您只需将代码复制到您的项目中即可。另请注意,如果您的 CPU 支持它,Go 运行时将使用 aeshash 来利用您的 CPU 的功能(更多信息在这里:How does go calculate a hash value for keys in a map?)。

引用较短的 32-bit version :

const (
    // Constants for multiplication: four random odd 32-bit numbers.
    m1 = 3168982561
    m2 = 3339683297
    m3 = 832293441
    m4 = 2336365089
)

func memhash(p unsafe.Pointer, seed, s uintptr) uintptr {
    if GOARCH == "386" && GOOS != "nacl" && useAeshash {
        return aeshash(p, seed, s)
    }
    h := uint32(seed + s*hashkey[0])
tail:
    switch {
    case s == 0:
    case s < 4:
        h ^= uint32(*(*byte)(p))
        h ^= uint32(*(*byte)(add(p, s>>1))) << 8
        h ^= uint32(*(*byte)(add(p, s-1))) << 16
        h = rotl_15(h*m1) * m2
    case s == 4:
        h ^= readUnaligned32(p)
        h = rotl_15(h*m1) * m2
    case s <= 8:
        h ^= readUnaligned32(p)
        h = rotl_15(h*m1) * m2
        h ^= readUnaligned32(add(p, s-4))
        h = rotl_15(h*m1) * m2
    case s <= 16:
        h ^= readUnaligned32(p)
        h = rotl_15(h*m1) * m2
        h ^= readUnaligned32(add(p, 4))
        h = rotl_15(h*m1) * m2
        h ^= readUnaligned32(add(p, s-8))
        h = rotl_15(h*m1) * m2
        h ^= readUnaligned32(add(p, s-4))
        h = rotl_15(h*m1) * m2
    default:
        v1 := h
        v2 := uint32(seed * hashkey[1])
        v3 := uint32(seed * hashkey[2])
        v4 := uint32(seed * hashkey[3])
        for s >= 16 {
            v1 ^= readUnaligned32(p)
            v1 = rotl_15(v1*m1) * m2
            p = add(p, 4)
            v2 ^= readUnaligned32(p)
            v2 = rotl_15(v2*m2) * m3
            p = add(p, 4)
            v3 ^= readUnaligned32(p)
            v3 = rotl_15(v3*m3) * m4
            p = add(p, 4)
            v4 ^= readUnaligned32(p)
            v4 = rotl_15(v4*m4) * m1
            p = add(p, 4)
            s -= 16
        }
        h = v1 ^ v2 ^ v3 ^ v4
        goto tail
    }
    h ^= h >> 17
    h *= m3
    h ^= h >> 13
    h *= m4
    h ^= h >> 16
    return uintptr(h)
}

// Note: in order to get the compiler to issue rotl instructions, we
// need to constant fold the shift amount by hand.
// TODO: convince the compiler to issue rotl instructions after inlining.
func rotl_15(x uint32) uint32 {
    return (x << 15) | (x >> (32 - 15))
}

关于go - 在 Go 中计算 hashCode,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39315830/

有关go - 在 Go 中计算 hashCode的更多相关文章

  1. ruby-on-rails - Textmate 'Go to symbol' 相当于 Vim - 2

    在Railcasts上,我注意到一个非常有趣的功能“转到符号”窗口。它像Command-T一样工作,但显示当前文件中可用的类和方法。如何在vim中获取它? 最佳答案 尝试:helptags有各种程序和脚本可以生成标记文件。此外,标记文件格式非常简单,因此很容易将sed(1)或类似的脚本组合在一起,无论您使用何种语言,它们都可以生成标记文件。轻松获取标记文件(除了下载生成器之外)的关键在于格式化样式而不是实际解析语法。 关于ruby-on-rails-Textmate'Gotosymbol

  2. ruby - 在Ruby中计算持续时间与毫秒之间的差异 - 2

    TL;DR:IneedtogetthedifferencebetweenHH:MM:SS.msandHH:MM:SS.msasHH:MM:SS:ms我需要什么:这是一个棘手的问题。我正在尝试计算两个时间戳之间的差异,如下所示:In:00:00:10.520Out:00:00:23.720应该交付:Diff:00:00:13.200我想我应该将时间解析为实际的Time对象并在那里使用差异。这在前一种情况下效果很好,并返回00:0:13.200。什么不起作用:然而,对于某些人来说,这并不能正常工作,因为Ruby使用usec而不是msec:In:00:2:22.760Out:00:2:31.

  3. ruby-on-rails - 在 View Rails 中计数 - 2

    在我的显示View中,我有一个要循环播放的项目列表。这一切都很好。但是,我想在每个项目前面得到一个数字,它随着每个循环递增(i=0,i++你知道这个练习)。现在,我如何在Rails中执行此操作?这是我现在得到的:"> 最佳答案 使用#each_with_index而不是在View中实例化变量!">. 关于ruby-on-rails-在ViewRails中计数,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.c

  4. ruby-on-rails - 在 Rails 中计算到下一个生日的天数 - 2

    我有一个模型,其中有一个名为birthday的date列。我如何计算距离用户下一个生日还有多少天? 最佳答案 这是一个简单的方法。你要确保捕获今年已经通过的案例(以及尚未通过的案例)classUser=bday(bday-Date.today).to_iendend并证明这一点!(我添加的是timecopgem以保持计算截至今天(2012-10-16)的准确性require'test_helper'classUserTest 关于ruby-on-rails-在Rails中计算到下一个生日

  5. ruby - 在 Ruby 中计算一个字节的奇偶校验 - 2

    在Ruby中计算一个字节是奇校验还是偶校验的最佳方法是什么?我有一个可用的版本:result="AB".to_i(16).to_s(2).count('1').odd?=>true不过,将数字转换为字符串并计算“1”似乎是一种糟糕的计算奇偶校验的方法。有什么更好的方法吗?我希望能够计算3DESkey的奇偶校验。最终,我想将偶数字节转换为奇数。谢谢,丹 最佳答案 除非你拥有的速度不够快,否则请保留它。它清晰简洁,性能比您想象的要好。我们将根据数组查找对所有内容进行基准测试,这是我测试过的最快的方法:ODD_PARITY=[false,

  6. ruby - 我如何在 Ruby 中计算字符串的宽度? - 2

    String.length只会告诉我字符串中有多少个字符。(其实在Ruby1.9之前,它只会告诉我多少个字节,这就更没用了。)我真的很想知道一个字符串有多少个“en”宽。例如:'foo'.width#=>3'moo'.width#=>3.5#m's,w's,etc.arewide'foi'.width#=>2.5#i's,j's,etc.arenarrow'foobar'.width#=>6.25#spacesareverynarrow如果我能得到字符串的第一个n就更好了:'foo'[0,2.en]#=>"fo"'filial'[0,3.en]#=>"fili"'foobarbaz'[

  7. ruby - 在 Elasticsearch 中计算地理距离 - 2

    我在查询中使用geo_distancefilter和tire,它工作正常:search.filter:geo_distance,:distance=>"#{request.distance}km",:location=>"#{request.lat},#{request.lng}"我预计结果会以某种方式包括到我用于过滤器的地理位置的计算距离。有没有办法告诉elasticsearch在响应中包含它,这样我就不必在ruby​​中为每个结果计算它?==更新==我在谷歌群组中的foundtheanswer:search.sortdoby"_geo_distance","location"=>"

  8. ruby-on-rails - 用于 Ruby 的 vim 中的全局 "Go to definition"? - 2

    自97年以来我一直在使用vi/vim进行各种快速编辑和管理任务,但最近才考虑使用它来替换Netbeans作为我选择的ruby​​编辑器。我发现一件事在Netbeans和Eclipse中非常有用的是Ctrl+Click“转到定义”功能,您可以在其中按住Ctrl键并单击一个类或方法,然后它将带您了解定义。现在,我玩过丰富的ctags和rails.vim,而且很接近,但没有雪茄。这就是我想要的:默认情况下在Netbeans和Eclipse中,您可以在本地rails中按住ctrl并单击本地方法或类项目,但你也可以ctrl+click定义在gems或用Ruby编写的系统库。以Netbeans为例

  9. ruby - 在 Ruby 中计算字符串中的所有字符 - 2

    有没有等价于PHP的strlen的Ruby中的方法?我知道Ruby的String#count方法,但它要求我定义一组要计数的字符。在我的情况下,我想计算所有字符,而不仅仅是某些字符。 最佳答案 使用String#size或String#length方法。它会为你工作。Returnsthecharacterlengthofstr.示例:"abc12-".size#=>7 关于ruby-在Ruby中计算字符串中的所有字符,我们在StackOverflow上找到一个类似的问题:

  10. sql - 按年、月分组,然后在 ActiveRecord 3 中计数 - 2

    我正在尝试统计一年和一个月内创建的所有用户,但以下内容似乎没有按预期工作。User.group("YEAR(created_AT),MONTH(created_at)").count("DISTINCT(id),YEAR(created_at),MONTH(created_at)")我在找类似的东西{2011=>{1=>222,2=>333,4=>444,5=>667...}}但是我得到了{1=>222,2=>333,4=>444,5=>667...}我是不是遗漏了什么,或者ActiveRecord不能在一次查询中给我这个结果? 最佳答案

随机推荐