12/04/11 21:29:19.49
>>5
ハッシュ計算アルゴリズムの規定はないからコンパイラが変われば結果は変わるだろうな
7:デフォルトの名無しさん
12/04/12 08:21:47.73
>>6
すみません言葉足らずでした。
はじめてプログラムが実行される時、内部で未初期化の値が使用されて
プログラムを起動する度(≠実行する度)に前回と違ったハッシュ値になりうるかどうかです。
以前、boost::hash_combineで上記の様な再現性の無い結果にはまったことがあったのでstd::hashでもそうなのかなと思いまして。
8:デフォルトの名無しさん
12/04/12 09:06:05.42
>>7
ハッシュ値の使用目的から常識的に考えて、そりゃバグだろ。
9:デフォルトの名無しさん
12/04/12 09:16:48.20
>>8
セキュリティの観点から、
プロセス起動ごとに、ハッシュ値を変える仕組みを採用していることがあるんだ。
ソルトのようなものだと思ってもらいたい。
10:デフォルトの名無しさん
12/04/12 09:29:00.37
そんな高尚な目的が無くても、アドレス値とか混ぜこんでるとそうなるな。
11:デフォルトの名無しさん
12/04/12 09:45:59.60
template <class T> struct hash<T*> の部分特殊化が標準ライブラリに含まれてるんで、
そういうことになるかな。
12:デフォルトの名無しさん
12/04/12 14:29:51.48
std::hashの目的としては、
単一のローカルなプログラムが、その一度の実行中に限り、
コンテナーの実装で使用するために十分なハッシュ値の提供。
ハッシュ値を比較することで文字列などのビット列の一致を調べるとか、
他のプログラムと通信してハッシュ値のやり取りとか、
暗号関連に十分な強度のあるハッシュではない。
CRCとかSHAみたいなハッシュ値を期待してはいけない。
次の規格改訂では、ユーザー型をstd::hashに簡単に対応させるためのライブラリが追加される予定。
URLリンク(www.open-std.org)
13:デフォルトの名無しさん
12/04/13 20:37:58.32
数年後にstd::hashを無節操に使ったプログラムが大問題を起こすんですねわかりました
14:デフォルトの名無しさん
12/04/14 00:42:36.83
std::weak_hashみたいな名前にしとけよ
15:デフォルトの名無しさん
12/04/14 00:52:46.90
std::ゼッケン
16:デフォルトの名無しさん
12/04/14 01:01:05.61
コンテナの実装にしか使えないなら<container_base>とか作って隔離しとけよな
<functional>なんかに入れんな
17:デフォルトの名無しさん
12/04/14 12:38:04.26
高速比較の用途ならいくらでもあるだろコンテナに限定する必要はない
でかいファイル同士の比較やロープ規模の文字列比較等
でかいデータの比較には重宝する
18:デフォルトの名無しさん
12/04/14 20:16:10.49
template <typename... Ts>
istream& operator>>(istream& is, tuple<Ts...>& t) {
//カンマ区切りのデータをタプルの各要素に読み込む。
//is >> get<i>(t) ができると仮定。
}
この実装をboostつかわずにしたいのですが、どうすればいいでしょうか?
まずは空白区切りでもいいです。
19:デフォルトの名無しさん
12/04/14 21:58:27.37
template <size_t remain>
struct helper
{
template <typename... Ts>
static void read(istream& is, tuple<Ts...>& t){
is >> get<sizeof...(Ts) - remain>(t);
helper<remain-1>::read(is, t);
}
};
template <>
struct helper<0>
{
template <typename... Ts>
static void read(istream& is, tuple<Ts...>& t){}
};
template <typename... Ts>
istream& operator>>(istream& is, tuple<Ts...>& t) {
helper<sizeof...(Ts)>::read(is, t);
return is;
}
20:541
12/04/14 23:41:06.10
>>19
ありがとうございます。
同じ方針で考えていましたが、
関数の部分特殊化ができないので挫折していました。
オブジェクトにすればよいのですね!
21:デフォルトの名無しさん
12/04/15 04:02:05.06
>>19
まだ使えるコンパイラないだろ
22:デフォルトの名無しさん
12/04/15 04:45:48.28
for(;;)
{
int left;
double right;
count = std::fscanf( stream, " %d, %f", &left, &right);
if( 1 != count ) break;
vector.push_back( std::tuple<int, double>( left, right ) );
}
何らかの構造化された文字列なら<cstdio>使ったほうが楽だぞ
23:デフォルトの名無しさん
12/04/15 06:23:07.31
>>21
Clang
24:デフォルトの名無しさん
12/04/15 11:25:58.06
gcc-4.7 もすでにリリース済みで、
めぼしい機能で実装されてないのは inheriting constructor くらい。
attributes さんはめぼしくないし
25:デフォルトの名無しさん
12/04/15 13:41:55.74
atomicは
26:デフォルトの名無しさん
12/04/15 14:02:11.43
thread_localは