diff options
author | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2004-12-06 15:31:26 +0000 |
---|---|---|
committer | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2004-12-06 15:31:26 +0000 |
commit | aa92750f27e519c225d9bb50e59ed063857e0c04 (patch) | |
tree | b52c2b9114e9af08bd0805ef2ff52988fe2976bf /hash.c | |
parent | 2cefbe9fb2297147c034086ff3b1b2dd9a9f5545 (diff) | |
download | ruby-aa92750f27e519c225d9bb50e59ed063857e0c04.tar.gz |
* process.c (proc_setgroups): [ruby-dev:25081]
* re.c (rb_reg_eqq): document fix. [ruby-talk:122541]
* io.c (io_fread): take VALUE argument.
* ext/socket/socket.c (sock_connect): use rb_str_new4().
[ruby-dev:25052]
* eval.c (rb_yield_0): [ruby-dev:25051]
* io.c (io_write): remove rb_str_locktmp(). [ruby-dev:25050]
* io.c (io_fwrite): takes VALUE string as an argument.
[ruby-dev:25050]
* ext/socket/socket.c (sock_connect): remove rb_str_locktmp().
[ruby-dev:25050]
* ext/socket/socket.c (udp_connect): [ruby-dev:25045]
* ext/socket/socket.c (udp_bind): ditto.
* ext/socket/socket.c (udp_send): ditto.
* ext/socket/socket.c (bsock_send): ditto.
* ext/socket/socket.c (s_recvfrom): ditto.
* hash.c (rb_hash_hash): should provide "hash" method where "eql?"
is redefined. [ruby-talk:122482]
* ext/socket/socket.c (bsock_setsockopt): [ruby-dev:25039]
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@7482 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'hash.c')
-rw-r--r-- | hash.c | 44 |
1 files changed, 44 insertions, 0 deletions
@@ -1497,6 +1497,49 @@ rb_hash_eql(hash1, hash2) return hash_equal(hash1, hash2, Qtrue); } + +rb_hash_hash_i(key, value, hp) + VALUE key, value; + long *hp; +{ + long h = *hp; + VALUE n; + + h = (h << 1) | (h<0 ? 1 : 0); + n = rb_hash(key); + h ^= NUM2LONG(n); + h = (h << 1) | (h<0 ? 1 : 0); + n = rb_hash(value); + h ^= NUM2LONG(n); + + *hp = h; + return ST_CONTINUE; +} + +/* + * call-seq: + * hash.hash -> fixnum + * + * Compute a hash-code for this hash. Two hashes with the same content + * will have the same hash code (and will compare using <code>eql?</code>). + */ + +static VALUE +rb_hash_hash(hash) + VALUE hash; +{ + long h; + VALUE n; + + h = RHASH(hash)->tbl->num_entries; + rb_hash_foreach(hash, rb_hash_hash_i, (VALUE)&h); + h = (h << 1) | (h<0 ? 1 : 0); + n = rb_hash(RHASH(hash)->ifnone); + h ^= NUM2LONG(n); + + return LONG2FIX(h); +} + static int rb_hash_invert_i(key, value, hash) VALUE key, value; @@ -2430,6 +2473,7 @@ Init_Hash() rb_define_method(rb_cHash,"==", rb_hash_equal, 1); rb_define_method(rb_cHash,"eql?", rb_hash_eql, 1); + rb_define_method(rb_cHash,"hash", rb_hash_hash, 0); rb_define_method(rb_cHash,"[]", rb_hash_aref, 1); rb_define_method(rb_cHash,"fetch", rb_hash_fetch, -1); rb_define_method(rb_cHash,"[]=", rb_hash_aset, 2); |