dsHashCode(哈希函数)

在TDSCore的数据结构开发过程中,总是需要唯一地判定某个对象,目前已有的deep-equals算法虽可以用于对比对象内容,但无法做到让对象在整个生命周期中被唯一标识。因此dsHashCode诞生了。

您可以通过如下方式引入dsHashCode

import { dsHashCode } from "tdscore"

# 特性

# 支持任何ECMA Script值

您可以传入任何值并获取其哈希码。

dsHashCode(1);
dsHashCode(true);
dsHashCode(null);
dsHashCode(undefined);
dsHashCode({});
dsHashCode(new DSObject());

# 对象的哈希码总是相等的

无论对象是否被修改,在对象的整个生命周期中,哈希码都是相等的,我们可以通过哈希码唯一确定一个对象。

const obj = {}

const hashCode1 = dsHashCode(obj);
const hashCode2 = dsHashCode(obj);
hashCode1 === hashCode2 // true

obj.a = ""
const hashCode3 = dsHashCode(obj);
hashCode3 === hashCode1 //true

# 相等的对象,哈希码相同

declare const a:number;
declare const b:number;
a === b;//true
dsHashCode(a) === dsHashCode(b); // true

const c = {};
const d = c;
dsHashCode(c) === dsHashCode(d); // true

# 自定义哈希算法

任何对象可通过实现IHashCodeGettable接口,自定义其哈希值。

自定义的哈希算法必须确保哈希值在整个对象的生命周期中总是相等。

//TypeScript
import IHashCodeGettable from "tdscore/lib/util/hash/IHashCodeGettable"
class A implements IHashCodeGettable{
    getHashCode():number{
        return 2401;
    }
}

dsHashCode(new A()); // 2401

事实上,有ECMA Script的灵活性,当您使用JavaScript时,可以用如下方法自定义哈希算法:

const a = {}
a.getHashCode = function(){
    return 2401;
}

dsHashCode(a); // 2401

//你甚至可以...
const f = function(){
    console.log(a)
}
f.getHashCode = ()=> 2402
dsHashCode(f) // 2402

DSObject实现了IHashCodeGettable接口。

# 污染性

对于实现了IHashCodeGettable的对象以及Primitive TypedsHashCode在计算过程中不会留下任何痕迹。
但对于其它对象,为了实现哈希码在整个生命周期不变这一点,算法不得不在对象中留下痕迹。在tdscore v0.1.17中,这个痕迹是一个闭包函数,您可以阅读相关源代码 (opens new window)进行进一步了解。