2014-10-11 45 views
0

我想實現一種東西它可以唯一標識,此外,它不包含其他字段。它的類似於Ruby中的BasicObject,或者java中的Object如何在生鏽的單元結構中執行`Hash`?

我已添加PartialEq特質。

struct Thing; 
impl PartialEq for Thing { 
    fn eq(&self, other: &Thing) -> bool { 
    unsafe { 
     self as *const Thing == other as *const Thing 
    } 
    } 
} 

現在,我想允許它進行散列,而問題是,我怎麼能實現Hash特質對不具有的Fileds單位結構?或者,我應該添加某種object_id嗎?

+0

你打算如何在這裏使用'Thing'?除非你總是希望每次都返回相同的散列,否則你確實需要一些數據。 – Dogbert 2014-10-11 08:20:27

+0

@Dogbert我只是想創建一些可以唯一標識自己的東西。如果你創建了一個'Thing'的實例'a',然後是'b',然後''c'等等,那麼'a'不應該等於除了它本身之外的其他任何'Thing'實例。如果這可以實施,我認爲它應該使用其身份散列。 – 2014-10-11 08:47:07

+2

依靠Rust中的對象標識(即它的內存位置)非常奇怪,因爲在堆棧上移動它可以改變位置。一個對象ID字段,例如隨機初始化或通過全局[原子計數器]初始化(http://doc.rust-lang.org/nightly/std/sync/atomic/struct.AtomicUint.html#method.fetch_add)會更好。 – huon 2014-10-11 13:07:18

回答

0

你不能依靠指針地址來確定魯斯特單元結構的確定唯一性,例如下面的代碼將打印相同的地址兩次:

struct Foo; 

fn main() { 
    let x = Foo; 
    let y = Foo; 
    println!("{}", &x as *const _); 
    println!("{}", &y as *const _); 
} 

你需要讓他們佔據至少一個給他們一個字段字節的內存,例如,你從來沒有使用:

struct Thing { 
    x: u8; 
} 

impl Thing { 
    fn new() -> Thing { 
     Thing { x: 0u8 } 
    } 
} 

然後,一個簡單的方法是繼續在同一軌道上,你要去,並使用在內存中的對象的地址作爲Hash的基準值:

use std::hash::{hash,Hash}; 
use std::hash::sip::SipState; 

struct Thing; 

impl Hash for Thing { 
    fn hash(&self, state: &mut SipState) { 
     let addr = self as *const Thing as u64; 
     addr.hash(state); 
    } 
} 

fn main() { 
    let f = Thing; 
    println!("{}", hash(&f)); 
} 

注:鑄造&Thing*const Thing(然後到u64)是不是不安全的,所以你不需要在你執行PartialEq的unsafe{}塊。

+0

「單元結構沒有被實例化並存儲在Rust的內存中,並且在這種狀態下,所有的Thing實例都是相等的」,這是不正確的,單元結構[確實有不同的地址](http:// play。 rust-lang.org/?run=1&code=struct%20Foo%3B%0A%0A%23%5Binline%28never%29%5D%0Afn%20bar%28%29%20{%0A%20%20%20% 20let%20X%20%3D%20Foo%3B%0A%20%20%20%20println!%28%22 {}%22%2C%20%26倍%20AS%20 * const的%20_1%29%3B%0A }%0A%0Afn%20main%28%29%20 {%0A%20%20%20%20let%20Y%20%3D%20Foo%3B%0A%20%20%20%20println!%28%22 { }%22%2C%20%26Y%20AS%20 * const的%20_1%29%3B%0A%20%20%20%20%0A%20%20%20%20巴%28%29%3B%0A} )。 (這就是說...... – huon 2014-10-11 13:01:59

+0

...他們可以很容易地以意想不到的方式行事,因爲它是零大小的,所以最好不要依賴它。) – huon 2014-10-11 13:02:49

+0

@dbaupp是的,但是如果你在例子中實例化兩次相同的範圍,它們將具有相同的地址... – Levans 2014-10-11 13:38:15

相關問題