在javascript上获取带有两个输入(字符串)的哈希键的方法?

时间:2013-12-05 13:09:56

标签: java javascript ruby

我需要生成一个带有两个输入(字符串)ex的散列键: inputA!= inputB为true

key1 = hash_method (inputA,inputB);

key2 = hash_method (inputB,inputA);

和条件

key1 === key2为真。

我将需要js但是如果有人可以帮助我使用java或ruby我可以引用它。 或者你有一些js的插件或库会很棒。我不需要密钥会非常安全,但我需要这只是

谢谢

3 个答案:

答案 0 :(得分:4)

我只是对字符串的哈希进行异或。这是在对象的字段上创建哈希的常用方法。异或是可交换的,所以你的条件应该是真的。

function hash_method(inputAHash, inputBHash) { return inputAHash ^ inputBHash };

链接:

This answer提供了如何计算字符串上的良好哈希码(以计算来自inputA和inputB的哈希值)的信息。

How to create hash codes基于对象的字段(这是一个Java教程,但同样适用于JS)。

答案 1 :(得分:3)

假设Java中用于字符串的哈希码生成足够好,在Javascript中实现它是非常简单的。如果你想要一个构建在多个字符串上的哈希码,其中字符串的顺序是无关紧要的,你可以将每个字符串的哈希码与xor结合起来。

可以使用一个或多个参数调用以下Javascript函数:

function hash() {

    var h=0, i=0;

    if(hash.arguments.length == 1) {
        for(i=0; i<hash.arguments[0].length; i++) {
            h = (h * 31 + hash.arguments[0].charCodeAt(i)) & 0xffffffff;
        }
    }
    else {
        for(i in hash.arguments) {
            h ^= hash(hash.arguments[i]);
        }
    }

    return h;
}

请注意,此函数的结果范围是无符号的([0,2 ^ 32>],而未签名([-2 ^ 31,2 ^ 31>])为Java的String#hashCode()

答案 2 :(得分:0)

我的最终解决方案:

var hash = function (params)  {
        var h=0, i=0;
        if(typeof (params) === "string") {
            for(i=0; i<params.length; i++) {
                h = (h * 31 + params.charCodeAt(i)) & 0xffffffff;
            }
        }
        else if( params instanceof Array) {
            for(i in params) {
                h ^= hash(params[i]);
            }
        }
        return h;
};

var a1 = "pc-1"; var a2 = "router-2";
var params1 = [a1, a2];
hash(params1); //result 6720633
var params2 = [a2,a1];
hash(params2); //result 6720633