如果我对唯一字符串使用简单的替换算法,输出是否始终是唯一的?

时间:2016-11-09 08:53:50

标签: algorithm hash

这有点像哈希,但更简单。类似的东西:

function getUniqueId(input) {
    var map = {
            A: 'Q', B: 'W', C: 'E',
            D: 'R', E: 'T', F: 'Y',
            G: 'U', H: 'I', I: 'O',
            J: 'P', K: 'A', L: 'S',
            M: 'D', N: 'F', O: 'G',
            P: 'H', Q: 'J', R: 'K',
            S: 'L', T: 'Z', U: 'X',
            V: 'C', W: 'V', X: 'B',
            Y: 'N', Z: 'M',
            a: 'q', b: 'w', c: 'e',
            d: 'r', e: 't', f: 'y',
            g: 'u', h: 'i', i: 'o',
            j: 'p', k: 'a', l: 's',
            m: 'd', n: 'f', o: 'g',
            p: 'h', q: 'j', r: 'k',
            s: 'l', t: 'z', u: 'x',
            v: 'c', w: 'v', x: 'b',
            y: 'n', z: 'm',
            0: '3', 1: '4', 2: '5',
            3: '6', 4: '7', 5: '8',
            6: '9', 7: '0', 8: '1',
            9: '2',
        },
        output = "";

    for (var i = 0; i < input.length; i++) {
        if (map[input[i]] !== undefined){
            output += map[input[i]];
        }
    }
    return output;
}

我只编码/散列/替换A-Z,a-z和0-9。

如果输入字符串始终是唯一的,那么输出字符串总是唯一吗?

2 个答案:

答案 0 :(得分:2)

如果通过对唯一的字符串的每个字符应用相同的替换函数来创建散列,则可以确保仅当替换函数为injective时,输出字符串才始终是唯一的。 此属性保留了清晰度,这是防止唯一性所需的。

要检查此属性,需要证明:a ≠ b, then f(a) ≠ f(b)。对于你的地图 - 对于数字而言显而易见,对于字母而言可能会令人困惑,但可以使用简单的bash脚本进行检查,该脚本收集所有目标值以查看是否存在两次:

echo "A: Q, B: W, C: E, D: R, E: T, F: Y, G: U, H: I, I: O, J: P,  G, P: H, Q: J, R: K, S: L, T: Z, U: X, V: C, W: V, X: B, Y: N, Z: M" | tr ',' '\n' | cut -d':' -f2 | sort | tr -d ' \n'

确实输出

ABCDEFGHIJKLMNOPQRSTUVWXYZ

由于您的功能不会改变字符的位置,并且每个字符都受到这种一对一的映射,因此唯一的输入将始终产生唯一的输出。

这当然只有在您确定输入字符串位于域AZ,az,0-9时才有效,否则它不会工作("@A"=>"Q""A"=>"Q"

答案 1 :(得分:1)

我想这取决于你如何定义&#34;简单替换&#34;。

如果您严格应用&#34;请将a替换为emen&#34; (而不是别的),将这种替换(我称之为#34;简单&#34;但不是&#34;可逆&#34;)应用于字符串&#34; cat&#34;和&#34;水泥&#34;最终都得到了reult&#34; cement&#34;。

编辑:你只有单字母替换,所以&#34;所有&#34;你需要确保没有&#34;目的地角色&#34;由两个(或更多)&#34;源字符映射到#34;。

最简单的方法是生成一个字符串,其中包含您喜欢的任何排序顺序中所有可能的可映射字符(因此,大写和小写字母,以及所有数字)(按ASCII值排序可能是最简单的)。然后生成编码版本,对其进行排序并进行比较。

由于您要映射所有源字符,并且您有一个仅由目标字符组成的字符串,如果它们的排序版本相同,则您没有任何重复,因此您可以保证两个不同的字符串也有不同的编码形式。