- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我正在构建一个 Bloom 过滤器并查看要使用的哈希值和 Bob Jenkins' hash由于分布均匀,这似乎是一个不错的选择。我将给定的 C++ 代码改编为 Go(可能犯了一个错误,但它似乎有效)。
我着手对哈希的成本进行基准测试,发现 Go std 库中的 SHA1 哈希要快得多。
PASS
BenchmarkJenkins 1000000 2649 ns/op
BenchmarkSHA256 1000000 1218 ns/op
BenchmarkSHA1 5000000 462 ns/op
当我读到您不应在此用例中使用加密哈希时,我是否被误导了?还是标准库代码比我的优化得多?
package jenkins
import (
"bytes"
"encoding/gob"
)
// adapted from http://bretmulvey.com/hash/7.html
func ComputeHash(key interface{}) (uint64, error) {
var buf bytes.Buffer
enc := gob.NewEncoder(&buf)
err := enc.Encode(key)
if err != nil {
return 0, err
}
data := buf.Bytes()
var a, b, c uint64
a, b = 0x9e3779b9, 0x9e3779b9
c = 0
i := 0
for i = 0; i < len(data)-12; {
a += uint64(data[i]) | uint64(data[i+1]<<8) | uint64(data[i+2]<<16) | uint64(data[i+3]<<24)
i += 4
b += uint64(data[i]) | uint64(data[i+1]<<8) | uint64(data[i+2]<<16) | uint64(data[i+3]<<24)
i += 4
c += uint64(data[i]) | uint64(data[i+1]<<8) | uint64(data[i+2]<<16) | uint64(data[i+3]<<24)
a, b, c = mix(a, b, c)
}
c += uint64(len(data))
if i < len(data) {
a += uint64(data[i])
i++
}
if i < len(data) {
a += uint64(data[i]) << 8
i++
}
if i < len(data) {
a += uint64(data[i]) << 16
i++
}
if i < len(data) {
a += uint64(data[i]) << 24
i++
}
if i < len(data) {
b += uint64(data[i])
i++
}
if i < len(data) {
b += uint64(data[i]) << 8
i++
}
if i < len(data) {
b += uint64(data[i]) << 16
i++
}
if i < len(data) {
b += uint64(data[i]) << 24
i++
}
if i < len(data) {
c += uint64(data[i]) << 8
i++
}
if i < len(data) {
c += uint64(data[i]) << 16
i++
}
if i < len(data) {
c += uint64(data[i]) << 24
i++
}
a, b, c = mix(a, b, c)
return c, nil
}
func mix(a, b, c uint64) (uint64, uint64, uint64) {
a -= b
a -= c
a ^= (c >> 13)
b -= c
b -= a
b ^= (a << 8)
c -= a
c -= b
c ^= (b >> 13)
a -= b
a -= c
a ^= (c >> 12)
b -= c
b -= a
b ^= (a << 16)
c -= a
c -= b
c ^= (b >> 5)
a -= b
a -= c
a ^= (c >> 3)
b -= c
b -= a
b ^= (a << 10)
c -= a
c -= b
c ^= (b >> 15)
return a, b, c
}
编辑:
基准代码:
package bloom
import (
"testing"
"crypto/sha1"
"crypto/sha256"
)
func BenchmarkJenkins(b *testing.B) {
j := jenkinsHash{}
for i := 0; i < b.N; i++ {
j.ComputeHash(i)
}
}
func BenchmarkSHA1(b *testing.B) {
for i := 0; i < b.N; i++ {
sha1.Sum([]byte{byte(i)})
}
}
func BenchmarkSHA256(b *testing.B) {
for i := 0; i < b.N; i++ {
sha256.Sum256([]byte{byte(i)})
}
}
最佳答案
我将赌注放在优化上; Bob Jenkin 的散列应该比任何加密风格的散列(如 SHA)快得多。我敢打赌,标准库为此调用了高度优化的 C(甚至汇编),这就是为什么它能击败未优化的 Go。
在 https://github.com/reusee/mmh3 似乎有一个有效的 Murmur3 可用于 Go (我没试过)。你可能会更幸运,或者通过调用 C/C++ 来实现你的 Bob Jenkins。
关于hash - Bob Jenkins 的 Hash 性能不佳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23436358/
考虑Uncle Bob's Clean Architecture (或洋葱架构) 我有以下场景: 我想向用户展示一个地方的信息:名称、类别、坐标。 我还希望在同一个屏幕上有一个按钮,点击该按钮后会重定
因此,当我将php与MySQL结合使用时,我只是这样做了: $result = $mysqli->query("SELECT * FROM table WHERE person='Bob'"); 我现
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 5 年前。 Improve
一周前,我观看了 Robert C. Martin 关于架构的演讲: http://www.youtube.com/watch?v=WpkDN78P884 我不明白您在 0:24:46 看到的图表。我
注意:这是对 SWF 文件中有关排序记录的现实问题的抽象改写。解决方案将帮助我改进开源应用程序。 Bob 有一家商店,他想打折。他的商店有许多产品,并且他有一定数量的每种产品的库存。他还有一些货架上的
我想知道我是否在使用 Clean Architecture正确的方式。我试图像这样放置它: 我读到包结构应该按用例排列,但我很难理解如何做到这一点。 让我们看看我的包结构: 请注意,我不知道将 Act
考虑 Uncle Bob's Clean Architecture (或洋葱架构) 假设作为我应用程序中的登录用户,我收到了一个深层链接 url “myapp://events/[event_id]”
Bob Jenkins 哈希函数是否有不区分大小写的变体? Generics.Defaults.BobJenkinsHash 提供快速哈希函数。不幸的是,它不能与不区分大小写的比较函数结合使用,如下所
我正在使用 jquery 在 LI 悬停时隐藏/显示 DIV。当我这样做时,div 出现了,但不停地上下弹出,直到我将鼠标从 LI 上移开。 $(document).ready(function ()
好吧,这看起来有点奇怪,但是当我尝试在 PHP 代码或 phpmyadmin 中运行 mysql 查询时,它不会返回任何内容: DELETE FROM `EmployeeNames` WHERE Fi
我已经在 CentOS 和 Python 级别上安装了所有必要的依赖项,并且认为我已经接近完成,但这就是我最后得到的。现在我不知道如何让它发挥作用。 Installed /tmp/easy_insta
这个问题在这里已经有了答案: String count with overlapping occurrences [closed] (25 个答案) 关闭 9 年前。 s = 'gfdhbo
我正在尝试使用通过 Conda 安装在我的 ubuntu 上的 bob 包;但是,在使用诸如 bob.measure.eer_threshold 之类的任何测量 API 时,会出现以下错误。我已经准备
Bob推荐其用户到install它的包使用conda , 但我不想使用 conda .如何从源代码安装它? 最佳答案 解释 首先,使用 conda 安装 Bob 要容易得多,并且是安装 Bob 的受支
考虑我在 hackerrank 上发现的这个问题: Coins Problem Alice and Bob were sitting in the sun; drinking orange juice
我想将数组元素传递给 bob bob.string.formatString 格式字符串,以便我可以传递任意数量的参数,并且它将自动填充占位符中所需的参数。这是我尝试过的。 var string =
如果我想从下面的字符串中提取值,正确的正则表达式(我可以在 Java 中使用)是什么? 我知道\将提取尖括号之间的所有内容,但我只需要提取“bob”。 字符串中唯一会改变的部分是“bob”。我还想确
在第 2 章:有意义的名称中,Bob 叔叔写道: Don't Add Gratuitous Context In an imaginary application called "Gas Statio
我正在构建一个 Bloom 过滤器并查看要使用的哈希值和 Bob Jenkins' hash由于分布均匀,这似乎是一个不错的选择。我将给定的 C++ 代码改编为 Go(可能犯了一个错误,但它似乎有效)
考虑: 用例层定义了一个接口(interface) public interface IGeocoder { Coordinate GetCoordinate(Address address)
我是一名优秀的程序员,十分优秀!