読者です 読者をやめる 読者になる 読者になる

素人がプログラミングを勉強していたブログ

プログラミング、セキュリティ、英語、Webなどのブログ since 2008

連絡先: すかいぷ:javascripter_  か javascripter あっと tsukkun.net skypeのほうがいいです

Hash

javascript
var Hash;
(function(){
  Hash=function(n){
    this.max=n;
    this.list=new Array(n);
  }
  Hash.prototype.add=function(key,value){
    var hv=getHashValue(this.max,key);
    var lv=this.list[hv];
    if(!lv)
      this.list[hv]=[];
    this.list[hv].push([key,value]);
    return this;
  }
  Hash.prototype.getByKey=function(key){
    var hv=getHashValue(this.max,key);
    var lv=this.list[hv];
    if(!lv)return this.fail;
    for(var i=0;i<lv.length;i++){
      if(lv[i][0]==key)
        return lv[i][1];
    }
    return this.fail;
  }
  Hash.fail=Hash.prototype.fail={};
  function getHashValue(max,str){
    var ret=0;
    for(var i=0;i<str.length;i++)
      ret+=str.charCodeAt(i);
    ret%=max;
    return ret;
  }
})();

var h=new Hash(100);
h.add("k",42);
h.getByKey("k") // 42
h.getByKey("aa")==h.fail // true

でも、JavaScriptだと普通にハッシュが使えるので、実際は下みたいなコードでいい。
キーに文字列以外も使いたいのだけど、object_idみたいなものがないから難しい

var Hash;
(function(){
  var data = {},uid=-1;
  Hash=function(){
    if(!(this instanceof arguments.callee))
      return Hash.apply({__proto__:Hash.prototype},arguments);
    data[++uid] = {};
    this.toString=function(){ return uid };
    return this;
  };
  Hash.prototype.add=function(key,val){
    data[this][key]=val;
    return this;
  };
  Hash.prototype.getByKey=function(key){
    return key in data[this]?data[this][key]:this.fail;
  };
  Hash.prototype.fail=Hash.fail={};
})();

Hash().add("b","x").getByKey("b"); // "x"
Hash().add("a","b").getByKey("x")==Hash.fail; // true