繁体   English   中英

以C / C ++和其他语言重现Java原语hashCode逻辑的库

[英]Library to reproduce the Java primitives hashCode logic in C / C++ and other languages

我想知道是否有一个多语言库或某些可以给我以下结果的库:

  • 我在Java中有一个String =“ Abcde12345”
  • 我们将假设其在Java中的哈希码为“ 78911”
  • 我在C程序中有一个字符串=“ Abcde12345”

我想知道的是:如何在我的C程序中轻松获取哈希码78911? 由于每种语言都可以为字符串提供自己的哈希算法,因此我该如何处理呢?


我是在使用分布式哈希表(数据网格,分布式缓存,NoSQL ...)的情况下问这个问题的。 我打算为Java专有数据网格创建类似于C的非常简单的客户端的东西。

这是我目前的用例,但是对于我的项目,我将需要与多种语言兼容的哈希算法:-Ruby中的Java哈希算法-Java中的C#哈希算法-Java中的C ++哈希算法-C ++中的Java哈希算法-Java哈希在任何情况下,两种语言在两种语言中的哈希值都将需要产生完全相同的哈希值。

而且,如果可能的话,我想将概念扩展到基本类型和“简单结构”,而不仅仅是字符串


有人知道有什么工具可以处理我的用例吗?


编辑:为吉姆·巴尔特

我的用例是:

我有一个用Java编写的专有分区/数据网格技术,称为GemFire。 它充当分布式哈希图。 哈希图中的存储桶数是固定的。 对于每个映射键,它计算其哈希码并应用模,以便它知道每个键到它所属的每个存储桶。

例如,如果我有113个存储桶(这是gemfire中的默认存储桶数),并且我的地图键是字符串“ Key”

"Key".hashCode() % 113 = 69

因此,GemFire知道“密钥”属于第69个存储桶。

现在我有一个C应用程序:

  • 该应用程序已经知道Gemfire(113)使用的存储桶数量。
  • 此应用程序必须能够为任何随机密钥计算GemFire将该随机密钥放入的存储区编号。
  • 该应用程序需要能够快速计算它,我们不能使用Web服务。
  • 此应用程序应该易于部署,并且我在C / Java之间没有任何桥梁技术-这需要安装JVM才能运行C应用程序

因此,如果您知道如何做到这一点而不必在C中编写/使用Java哈希码端口,请告诉我。

编辑:避免混淆:我不是在寻找其他东西,但是吉姆·巴尔特(Jim Balter)你建议我不需要我声称需要的东西,所以请告诉我是否有其他解决方案,除非使用像您所说的自定义或流行哈希算法。

将来我可能需要对带有C#客户端应用程序和其他语言的Erlang分区应用程序执行相同的操作!


编辑:我想避免使用非Java哈希算法(如有人建议使用md5 / sha1或任何更快的非面向安全的哈希算法)。 这是因为我的解决方案旨在部署在通常用Java编写的旧式分布式系统上,该系统已经包含很多数据,并且哈希算法的任何更改都将需要繁重的数据迁移过程。 但是,我谨记此解决方案,因为对于那些从头开始创建新的分布式系统或准备进行数据迁移的人来说,这可能是一个不错的选择。


所以最后,我要寻找的不是没有人告诉我要用C实现Java String hash算法,我已经知道我可以做到这一点,谢谢! 我想知道是否有人已经这样做了,不仅是为了用C实现所有原始Java算法,而且还实现了其他语言以及其他语言的语言!!! 我正在寻找一个多语言的库,该库提供彼此的语言,哈希算法的端口。

因此,如果地球上只有3种语言(C,Java和Python),我的问题是:是否有提供以下功能的多语言库:

  • C语言中的Java哈希端口
  • Python中Java哈希的端口
  • Java中的C哈希端口
  • Python中的C哈希端口
  • Java中的Python哈希端口
  • C语言中的Python哈希端口

对于所有可用的原始类型,以及最终的基本结构。 如果对于给定的语言,没有“默认哈希算法”,则可以将使用最广泛的语言视为语言算法。

你明白我的意思吗? 我想知道是否有图书馆! 我知道我可以查看JDK或规范并自行实现,但是由于我的目标是大量的语言,而且我不知道如何使用每种语言进行编码,所以我希望有人能够做到这一点对我来说,并提供了一个免费使用的开源项目!

我要补充一点,您可以通过OpenJDK的源代码浏览并查看hashCode实现。 但是,请记住,正如吉姆·加里森(Jim Garrison)建议的注释所建议的那样,不同的类可能会覆盖hashCode,因此您必须遵循实现。 我建议对字符串进行哈希处理以使用众所周知的哈希函数,例如sha-1或md5-您可以在Java,C / C ++和其他编程语言中找到实现。

计算Java字符串的哈希码的算法非常简单,并作为公共规范的一部分进行了记录: http//docs.oracle.com/javase/1.4.2/docs/api/java/lang/String。 html#hashCode ()

字符串对象的哈希码计算为s [0] * 31 ^(n-1)+ s [1] * 31 ^(n-2)+ ... + s [n-1]

使用int算术,其中s [i]是字符串的第i个字符,n是字符串的长度,^表示幂。 (空字符串的哈希值为零。)

还要注意,String是一个最终类,因此它的方法不能被覆盖。 因此,可以确保给定的算法对于任何Java String都是正确的。

对于Java以外的其他语言,如果该语言未指定哈希算法(并且Java在这种情况下并不常见),则即使可以确定哈希算法也无法确定不会更改。 我怀疑您实际上并不需要您声称的需求,但是您将不得不对您的需求多说一些(而不是您认为可以解决的需求)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM