Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/453.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 简单散列函数(从字符串输入输出1字节)_Java_Javascript_Xslt_Hash - Fatal编程技术网

Java 简单散列函数(从字符串输入输出1字节)

Java 简单散列函数(从字符串输入输出1字节),java,javascript,xslt,hash,Java,Javascript,Xslt,Hash,我正在寻找一个简单的哈希算法,它将为字符串输入提供一个字节的输出(如果有帮助的话,输入将是RFC822电子邮件地址) 我希望它简单、快速,并放大输入差异(因此两个相似的地址有不同的输出)。(是的,我要求在一个字节的输出中有很多内容。) 理想情况下,我想要一个XSL答案,但我可以在Java或Javascript中使用它(然后将哈希作为参数传递给XSL处理器) 谢谢。使用一个包含9位信息的CRC-8,然后在两端各放一点,结束通话。否则,请使用任何其他常见的CRC算法。为什么不使用标准字符串hashC

我正在寻找一个简单的哈希算法,它将为字符串输入提供一个字节的输出(如果有帮助的话,输入将是RFC822电子邮件地址)

我希望它简单、快速,并放大输入差异(因此两个相似的地址有不同的输出)。(是的,我要求在一个字节的输出中有很多内容。)

理想情况下,我想要一个XSL答案,但我可以在Java或Javascript中使用它(然后将哈希作为参数传递给XSL处理器)


谢谢。

使用一个包含9位信息的CRC-8,然后在两端各放一点,结束通话。否则,请使用任何其他常见的CRC算法。

为什么不使用标准字符串
hashCode()
函数的最高/最低有效字节?

每个哈希函数都有其优缺点,快速且易于计算的哈希函数往往对某些数据类表现不佳。试错法需要成为任何解决方案的一部分。除其他建议外,您还可以尝试使用整数乘法作为哈希函数的一部分,例如

hash = 0
for (int i=0; i<data.length; i++)
    hash = ((37 * hash) + data[i]) & 0xff;
hash=0

对于(int i=0;i我的建议是简单地对字符串中的所有字节进行异或运算。每个字节的每一位都会影响最终结果,任何一位错误都肯定会导致哈希值不同


非常简单,速度非常快。考虑到结果位的数量很少,可能与任何其他解决方案一样好。

这应该可以作为java解决方案,但我坚持使用XSLT解决方案。您可能需要更多的解决方案,因为大多数电子邮件地址主要是带有一个“@”和一个“.”的小写ascii。因此,您只能获得大约5位of变化而不是8。我不认为这个问题过于简单化的前提需要付出比这更大的努力。如果在31/32例(=96.9%)或255/256例(=99.6%)中检测到不同的地址,这真的重要吗?简单XOR的一个可能问题是它不受顺序的影响,因此“abc”与“cba”具有相同的哈希值。但XOR最终可能与更痛苦的事情一样好或更好,因为正如您所指出的,8位输出基本上不可能做得很好。XOR方法将在任何位位置检测奇数个位错误,这是一个确定的加号。冒着过度工程的风险,我会尝试计算较低的阶如您所建议的5位散列,高阶3位使用类似于我前面的方法,但使用hash3=((5*hash3)+data[i])mod 7。这也应该可以检测到大约6/7的乱序地址。如果一个位切换为0->1,另一个位切换为1->0,那么对于这样一个修改过的字符串,您将得到相同的散列。所以“abcd”将具有与“acbd”相同的哈希值。如果你想要一个基于XSLT的解决方案,那么它是否会产生1字节的结果真的很重要吗?这到底有什么作用?@BernardoDalCorno:它只是一个代码片段的几行,不是一个完整的可编译方法。什么部分让人困惑?如果有帮助的话,我可以把它变成一个真正的方法。那么,为什么要乘以37而不是29呢?这个结果会有什么作用当添加字符(不是另一个数字)时,“&”运算符在做什么?为什么使用0xff(为什么不使用255而不是十六进制)?